home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-076 < prev    next >
Internet Message Format  |  1995-12-31  |  131KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-076
  3. To: csmp-digest@ens.fr
  4. Date: Fri, 23 Dec 1994 12:22:34 +0100 (MET)
  5. Mime-Version: 1.0
  6. Reply-To: pottier@clipper.ens.fr
  7. X-Sequence: 82
  8.  
  9. C.S.M.P. Digest             Fri, 23 Dec 94       Volume 3 : Issue 76
  10.  
  11. Today's Topics:
  12.  
  13.         AEInstallEventHandler Problem
  14.         How do I keep my program from coming to the foregroud for drags?!?!
  15.         How do you use the mouse as a relative motion device?
  16.         How to convert a Picture to a PixPat?
  17.         Info on BlockMoveData ?
  18.         Installer advice please?
  19.         Mac FAQ now available as HTML using WWW!
  20.         PowerPlant vs. MacApp - opinions ?
  21.         QuickDraw GX Thread Safe?
  22.         [Q] Need help with SetGWorld.
  23.         static RoutineDescriptors
  24.  
  25.  
  26.  
  27. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  28. (pottier@clipper.ens.fr).
  29.  
  30. The digest is a collection of article threads from the internet newsgroup
  31. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  32. regularly and want an archive of the discussions.  If you don't know what a
  33. newsgroup is, you probably don't have access to it.  Ask your systems
  34. administrator(s) for details.  If you don't have access to news, you may
  35. still be able to post messages to the group by using a mail server like
  36. anon.penet.fi (mail help@anon.penet.fi for more information).
  37.  
  38. Each issue of the digest contains one or more sets of articles (called
  39. threads), with each set corresponding to a 'discussion' of a particular
  40. subject.  The articles are not edited; all articles included in this digest
  41. are in their original posted form (as received by our news server at
  42. nef.ens.fr).  Article threads are not added to the digest until the last
  43. article added to the thread is at least two weeks old (this is to ensure that
  44. the thread is dead before adding it to the digest).  Article threads that
  45. consist of only one message are generally not included in the digest.
  46.  
  47. The digest is officially distributed by two means, by email and ftp.
  48.  
  49. If you want to receive the digest by mail, send email to listserv@ens.fr
  50. with no subject and one of the following commands as body:
  51.     help                                Sends you a summary of commands
  52.     subscribe csmp-digest Your Name     Adds you to the mailing list
  53.     signoff csmp-digest                 Removes you from the list
  54. Once you have subscribed, you will automatically receive each new
  55. issue as it is created.
  56.  
  57. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  58. Questions related to the ftp site should be directed to
  59. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  60. digest are available there.
  61.  
  62. Also, the digests are available to WAIS users.  To search back issues
  63. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  64. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  65.  
  66.  
  67. -------------------------------------------------------
  68.  
  69. >From a052@amug.org (Jeff Corr)
  70. Subject: AEInstallEventHandler Problem
  71. Date: 3 Dec 1994 21:38:20 GMT
  72. Organization: Arizona Macintosh Users Group
  73.  
  74. I am unable to compile a program in part because I do not have
  75. documentation (i.e. the appropriate volume of Inside Macintosh) for the
  76. AEInstallEventHandler function although I did find the declaration for
  77. AEInstallEventHandler in the Types.h file.  I have not found a #define for
  78. the AEEventHandlerUPP type that is used in the declaration of
  79. AEInstallEventHandler in any of the header files that I included and
  80. perhaps this is contributing to this problem.  The relevant information and
  81. code follow.   
  82.  
  83.  
  84. These fragments of code are from the Macintosh C Primer by Dave Mark and
  85. Cartwright Reed.
  86.  
  87.  
  88. /*****  EventTracker  *****/
  89.  
  90. #include <AppleEvents.h>
  91. #include <GestaltEqu.h>
  92. #include <Limits.h>
  93. .
  94. . (irrelevant declarations omitted) 
  95. .
  96. /* declaration for the EventHandler function follows */
  97.  
  98. pascal  OSErr   DoOpenApp (AppleEvent theAppleEvent,  AppleEvent reply,  long
  99. refCon);
  100. .
  101. . (more irrelevant declarations and code omitted)
  102. .
  103.  
  104. /*****  EventInit  *****/
  105.  
  106. void EventInit (void)
  107. {
  108.    OSErr        err;    /* Straight from the book... I tried putting the pascal
  109. identifier before OSErr but this did not help */
  110. .
  111. .
  112. .
  113.    err = AEInstallEventHandler (kCoreEventClass, kAEOpenApplication,
  114. DoOpenApp, 0L, false);
  115.    if (err != noErr)  DrawEventString ("\pkAEOpenApplication Apple Event
  116. not available!");
  117. .
  118. . (no more relevant code)
  119. .
  120.  
  121. >From the codeWarrior message window:
  122.  
  123.  
  124. %% Error   : declaration syntax error
  125.    EventTracker.c line 110   err =
  126. AEInstallEventHandler(kCoreEventClass,kAEOpenApplication, DoOpenApp, 0L,
  127. false);
  128.  
  129. note: I included MacOS.Lib in the project file.
  130.  
  131.  
  132. The declaration that I found in Types.h:
  133.  
  134. extern pascal OSErr AEInstallEventHandler(AEEventClass theEventClass,
  135. AEEventID theEventID, AEEventHandlerUPP handler, long handlerRefcon,
  136. Boolean isSysHandler)
  137.  THREEWORDINLINE(0x303C, 0x091F, 0xA816)
  138.  
  139. I have not found the declaration for AEEventHandlerUPP (the third parameter
  140. that is passed in the above declaration) in any of the header files.
  141.  
  142. Apologies if this is too trivial a matter for this group.  I am very much a
  143. beginner at this but I can assure you that I have spent alot of time trying
  144. to figure this out. I plan on getting the CD version of Inside Macintosh as
  145. soon as santa brings me a CD-ROM.
  146.  
  147. Regards,
  148.  
  149. Jeff
  150.  
  151.  
  152.  
  153.  
  154.  
  155. -- 
  156. This (code) warrior is still in boot camp.
  157.  
  158. Jeff Corr
  159. a052@amug.org   Arizona Macintosh Users Group
  160.  
  161. +++++++++++++++++++++++++++
  162.  
  163. >From piz@magnet.at (Andreas Pizsa)
  164. Date: 06 Dec 1994 00:55:10 GMT
  165. Organization: The Personal Online Source
  166.  
  167. > I have not found a #define for
  168. >the AEEventHandlerUPP type that is used in the declaration of
  169. >AEInstallEventHandler in any of the header files that I included and
  170. >perhaps this is contributing to this problem.  The relevant information and
  171. >code follow.   
  172.  
  173. Here is some code that does what you need; note the NewAEEventHandlerProc
  174. function, which actually is a macro on 68k-Macs.
  175.  
  176. static EventListEntry theEventList[]={
  177.         { kAEDBSuite,kAEGetData,(ProcPtr)GetDataEvent },
  178.         { kCoreEventClass,kAEQuitApplication,(ProcPtr)QuitApplication},
  179.         { kFirstAccessSuite,kGetStatusEvent,(ProcPtr)GetStatusEvent},
  180.         { kFirstAccessSuite,kAEFindFormEvent,(ProcPtr)AEGetFormHandler}
  181. };
  182.  
  183.         /*
  184.         ** Install the AppleEvent handlers
  185.         **
  186.         ** We*re using the Universal Headers, so NewAEEventHandlerProc is called
  187.         ** It*s not necessary to call DisposeRoutineDescriptor, since this is done
  188.         ** automatically when the application exits & the heap is cleared
  189.         */
  190.  
  191.         for(i=0;i<sizeof(theEventList)/sizeof(theEventList[0]);++i){
  192.                 myErr=AEInstallEventHandler(
  193.                         theEventList[i].theClass,
  194.                         theEventList[i].theID,
  195.                         NewAEEventHandlerProc(theEventList[i].theProc),
  196.                         (long)myGlobalsH,false
  197.                         );
  198.                 if(myErr){
  199.                         #ifdef DEBUG
  200.                                 DebugStr("\pError installing AppleEvent Handler");
  201.                         #endif
  202.                         SysBeep(0);
  203.                         goto err;
  204.                 }
  205.         }
  206.  
  207.  
  208. Hope this helps!
  209.  
  210. Andreas
  211. FirstAccess Developer
  212. Networx GmbH
  213.  
  214.  --------------------------------------------------------
  215.  sent via  m a g n e t / +43-1-522-7-225 / info@magnet.at
  216.  --------------------------------------------------------
  217.  
  218.  
  219. +++++++++++++++++++++++++++
  220.  
  221. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  222. Date: Thu, 8 Dec 1994 20:40:42 GMT
  223. Organization: Apple Computer
  224.  
  225. Jeff Corr, a052@amug.org writes:
  226. > I am unable to compile a program in part because I do not have
  227. > documentation (i.e. the appropriate volume of Inside Macintosh) for the
  228. > AEInstallEventHandler function although I did find the declaration for
  229. > AEInstallEventHandler in the Types.h file.
  230.  
  231. That's funny, the declaration should be in AppleEvents.h along with all the
  232. other AE stuff.
  233. Assuming you are compiling for 68k, just cast the address of the function to
  234. an AEEventHandlerUPP:
  235.  
  236. AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,
  237.     (AEEventHandlerUPP)&DoOpenApp, 0L,false);
  238.  
  239. If you're compiling for PPC you need to make up a routine descriptor; better
  240. wait for Santa to bring your Inside Mac, as this stuff gets a bit trickier.
  241.  
  242. --Jens Alfke                           jens_alfke@powertalk.apple.com
  243.                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  244.  
  245. ---------------------------
  246.  
  247. >From rhagopia@terminator.rs.itd.umich.edu
  248. Subject: How do I keep my program from coming to the foregroud for drags?!?!
  249. Date: 18 Nov 1994 14:43:59 -0500
  250. Organization: University of Michigan Archives
  251.  
  252. OK, I'm implementing the dragmanager into my program. Everything's great.
  253. Other programs get my data, yea. (I don't accept drags because it's a
  254. read-only document) HOWEVER, I seem to have a problem when my app is
  255. in the background and someone tries to drag hilited text out into the
  256. foreground. According to the HIG, and the way the Finder and Scrapbook
  257. behave, my app should NOT come to the foreground, the drag should just
  258. move from the background to the foreground. Now note that the Finder and
  259. the Scrapbook are the only two apps that I've found that do this properly;
  260. SimpleText, Zterm, and even StickyNotes (and I think the Notepad too) all
  261. botch it up and come to the front.
  262.  
  263. So the question is, how to keep my app from rising to the front when I
  264. don't want it to. I checked the SIZE resources, and both had on front
  265. clicks. So I turned them on in my app, and nothing new happens. <sigh>
  266. I start going through and checking on the events I'm getting.
  267.  
  268. Unfortunatly, I seem to be brought to the front before a resume evt (my
  269. window comes to the front that is), then I get my resume evt, then I get
  270. my mousedown. This annoys me to no end, as I'd like to make it right,
  271. even though most apps that I've seen don't bother (oh, the DragText
  272. example doesn't do it right either...). The only thing I could think of
  273. was my SIZE resource, but the three that I could see making a difference
  274. seem to be the same as the Finder/Scrapbook... (acceptSuspendResume,
  275. doesActivateOnSuspendResume, and getFrontClicks... all true)
  276.  
  277. Please help! Thx!
  278. -- 
  279. | Rob Hagopian.           | FINGER me! (01/18) | Moon Over Miami |   Four   |
  280. | rhagopia@nyx.cs.du.edu  +--------------------+-----------------+ lines? I |
  281. | rhagopia@terminator.rs. |GC 1.0.1: GU d -p+(-) c++++ !l u++ e/+| only get |
  282. |          itd.umich.edu  |       m/- s/- !n h f? g+ w+ t-- r- y?|   four   |
  283.  
  284. +++++++++++++++++++++++++++
  285.  
  286. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  287. Date: 19 Nov 1994 08:40:35 GMT
  288. Organization: Royal Institute of Technology, Stockholm, Sweden
  289.  
  290. In article <3aj05v$f9u@terminator.rs.itd.umich.edu> rhagopia@terminator.rs.itd.umich.edu writes:
  291. ) OK, I'm implementing the dragmanager into my program. Everything's great.
  292. ) Other programs get my data, yea. (I don't accept drags because it's a
  293. ) read-only document) HOWEVER, I seem to have a problem when my app is
  294. ) in the background and someone tries to drag hilited text out into the
  295. ) foreground. According to the HIG, and the way the Finder and Scrapbook
  296. ) behave, my app should NOT come to the foreground, the drag should just
  297. ) move from the background to the foreground. Now note that the Finder and
  298. ) the Scrapbook are the only two apps that I've found that do this properly;
  299. ) SimpleText, Zterm, and even StickyNotes (and I think the Notepad too) all
  300. ) botch it up and come to the front.
  301.  
  302. I could tell you how to do this, but then Apple would have both of us shot.
  303. This is yet another thing that only system programs like the Finder are
  304. allowed to do.
  305.  
  306.  
  307. /Bo Lindbergh
  308.  
  309. +++++++++++++++++++++++++++
  310.  
  311. >From rhagopia@terminator.rs.itd.umich.edu (Rob Hagopian)
  312. Date: 19 Nov 1994 05:24:27 -0500
  313. Organization: University of Michigan Archives
  314.  
  315. In article <3akdm3$oav@news.kth.se>,
  316. Bo Lindbergh <d88-bli@xbyse.nada.kth.se> wrote:
  317. :In article <3aj05v$f9u@terminator.rs.itd.umich.edu> rhagopia@terminator.rs.itd.umich.edu writes:
  318. :) OK, I'm implementing the dragmanager into my program. Everything's great.
  319. :) Other programs get my data, yea. (I don't accept drags because it's a
  320. :) read-only document) HOWEVER, I seem to have a problem when my app is
  321. :) in the background and someone tries to drag hilited text out into the
  322. :) foreground. According to the HIG, and the way the Finder and Scrapbook
  323. :) behave, my app should NOT come to the foreground, the drag should just
  324. :) move from the background to the foreground. Now note that the Finder and
  325. :) the Scrapbook are the only two apps that I've found that do this properly;
  326. :) SimpleText, Zterm, and even StickyNotes (and I think the Notepad too) all
  327. :) botch it up and come to the front.
  328. :
  329. :I could tell you how to do this, but then Apple would have both of us shot.
  330. :This is yet another thing that only system programs like the Finder are
  331. :allowed to do.
  332.  
  333. Any hints? I've traced through them and they don't even go through a call
  334. -- 
  335. | Rob Hagopian.           | FINGER me! (01/18) | Moon Over Miami |   Four   |
  336. | rhagopia@nyx.cs.du.edu  +--------------------+-----------------+ lines? I |
  337. | rhagopia@terminator.rs. |GC 1.0.1: GU d -p+(-) c++++ !l u++ e/+| only get |
  338. |          itd.umich.edu  |       m/- s/- !n h f? g+ w+ t-- r- y?|   four   |
  339.  
  340. +++++++++++++++++++++++++++
  341.  
  342. >From h+@metrowerks.com (Jon W{tte)
  343. Date: Sun, 20 Nov 1994 16:42:32 +0100
  344. Organization: The Conspiracy
  345.  
  346. In article <3akjor$ruj@terminator.rs.itd.umich.edu>,
  347. rhagopia@terminator.rs.itd.umich.edu (Rob Hagopian) wrote:
  348.  
  349. >:I could tell you how to do this, but then Apple would have both of us shot.
  350. >:This is yet another thing that only system programs like the Finder are
  351. >:allowed to do.
  352.  
  353. >Any hints? I've traced through them and they don't even go through a call
  354.  
  355. There is this magic system call you have to make to register 
  356. that you want clicks without a switchin.
  357.  
  358. There *WAS* a gestalt bit to test for this call, but in the 
  359. very latest Universal Headers, that bit has been conveniently 
  360. "forgotten".
  361.  
  362. Because of that, I don't think it's good idea to actually use 
  363. the stuff if you reverse-engineer it, but on the other hand, 
  364. it's functionality that Apple should *really* provide to 
  365. developers.
  366.  
  367. Cheers,
  368.  
  369.                                         / h+
  370.  
  371.  
  372. --
  373.   Jon Wdtte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  374.  
  375.    Cookie Jar: Vanilla Yoghurt with Crushed Oreos.
  376.  
  377.  
  378. +++++++++++++++++++++++++++
  379.  
  380. >From rhagopia@terminator.rs.itd.umich.edu (Rob Hagopian)
  381. Date: 21 Nov 1994 00:11:26 -0500
  382. Organization: University of Michigan Archives
  383.  
  384. In article <AAF52CF8966820152@klkmac003.nada.kth.se>,
  385. Jon W{tte <h+@metrowerks.com> wrote:
  386. >There is this magic system call you have to make to register 
  387. >that you want clicks without a switchin.
  388. >
  389. >There *WAS* a gestalt bit to test for this call, but in the 
  390. >very latest Universal Headers, that bit has been conveniently 
  391. >"forgotten".
  392.  
  393. Really? It's still in the CW/4 Univ Headers... I believe it's
  394. bit 10... :-)
  395.  
  396. >Because of that, I don't think it's good idea to actually use 
  397. >the stuff if you reverse-engineer it, but on the other hand, 
  398. >it's functionality that Apple should *really* provide to 
  399. >developers.
  400.  
  401. I decided not to persue it further after I found out it was
  402. not kosher... Well, at least for anything I'll be releasing :-)
  403. -- 
  404. | Rob Hagopian.           | FINGER me! (01/18) | Moon Over Miami |   Four   |
  405. | rhagopia@nyx.cs.du.edu  +--------------------+-----------------+ lines? I |
  406. | rhagopia@terminator.rs. |GC 1.0.1: GU d -p+(-) c++++ !l u++ e/+| only get |
  407. |          itd.umich.edu  |       m/- s/- !n h f? g+ w+ t-- r- y?|   four   |
  408.  
  409. +++++++++++++++++++++++++++
  410.  
  411. >From wombat@claris.com (Scott Lindsey)
  412. Date: Thu, 01 Dec 1994 20:30:05 -0800
  413. Organization: Claris Corp., Vancouver WA
  414.  
  415. In article <3akjor$ruj@terminator.rs.itd.umich.edu>,
  416. rhagopia@terminator.rs.itd.umich.edu (Rob Hagopian) wrote:
  417.  
  418. > In article <3akdm3$oav@news.kth.se>,
  419. > Bo Lindbergh <d88-bli@xbyse.nada.kth.se> wrote:
  420. > :In article <3aj05v$f9u@terminator.rs.itd.umich.edu>
  421. rhagopia@terminator.rs.itd.umich.edu writes:
  422. > :) OK, I'm implementing the dragmanager into my program. Everything's great.
  423. > :) Other programs get my data, yea. (I don't accept drags because it's a
  424. > :) read-only document) HOWEVER, I seem to have a problem when my app is
  425. > :) in the background and someone tries to drag hilited text out into the
  426. > :) foreground. According to the HIG, and the way the Finder and Scrapbook
  427. > :) behave, my app should NOT come to the foreground, the drag should just
  428. > :) move from the background to the foreground. Now note that the Finder and
  429. > :) the Scrapbook are the only two apps that I've found that do this properly;
  430. > :) SimpleText, Zterm, and even StickyNotes (and I think the Notepad too) all
  431. > :) botch it up and come to the front.
  432. > :
  433. > :I could tell you how to do this, but then Apple would have both of us shot.
  434. > :This is yet another thing that only system programs like the Finder are
  435. > :allowed to do.
  436. > Any hints? I've traced through them and they don't even go through a call
  437.  
  438. Well, here's a hint: Scrapbook registers some sort of magic callback via
  439. _OSDispatch with a selector of $55.  This routine gets called by the
  440. system when there's a click in the non-active application, before the
  441. application's call to WNE returns.  This is where the drag (if there is
  442. one) gets initiated.  As it's been pointed out before, Apple hasn't
  443. documented this, and while there's a certain perverse pleasure in figuring
  444. out how things work (like the layer manager), using undocumented calls can
  445. hurt you when the system changes (like the layer manager).
  446.  
  447. While Apple hasn't documented this, it might be worth noting that the
  448. Scrapbook application (no, it's not a DA anymore) was written by a third
  449. party, Light Software, for whom it was either documented or who reverse
  450. engineered it with the expectation that the Scrapbook is system software
  451. and doesn't necessarily have to be compatible with future system software
  452. (since it can be revved).
  453.  
  454. -- 
  455. Scott Lindsey <wombat@claris.com>
  456.  
  457. ---------------------------
  458.  
  459. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  460. Subject: How do you use the mouse as a relative motion device?
  461. Date: 28 Nov 1994 00:15:33 GMT
  462. Organization: University of Canterbury, Christchurch, New Zealand
  463.  
  464.  
  465. Various games, such as Oxyd and Wolf 3D, use the
  466. mouse as a relative rather than absolute motion
  467. device. That is, moving the mouse causes some
  468. corresponding motion in the game, but there is
  469. no limit of the mouse hitting the edge of the
  470. screen.
  471.  
  472. How is this accomplished? Two approaches I
  473. can think of are:
  474.  
  475. (1) Somehow intercept the motion signals coming
  476. from the mouse at a lower level than the usual
  477. event mechanism.
  478.  
  479. (2) Periodically reset the pointer location to
  480. the middle of the screen.
  481.  
  482. There doesn't seem to be any official way of
  483. doing either of these. Does anyone know how
  484. the trick is usually done, and what is the
  485. least non-portable way of going about it?
  486.  
  487. Greg Ewing, Computer Science Dept, +--------------------------------------+
  488. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  489. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  490. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  491.  
  492. +++++++++++++++++++++++++++
  493.  
  494. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  495. Date: 28 Nov 1994 10:31:52 GMT
  496. Organization: (none)
  497.  
  498. greg@cosc.canterbury.ac.nz (Greg Ewing) writes:
  499.  
  500.  
  501. >Various games, such as Oxyd and Wolf 3D, use the
  502. >mouse as a relative rather than absolute motion
  503. >device. That is, moving the mouse causes some
  504. >corresponding motion in the game, but there is
  505. >no limit of the mouse hitting the edge of the
  506. >screen.
  507.  
  508. >How is this accomplished? Two approaches I
  509. >can think of are:
  510.  
  511. >(1) Somehow intercept the motion signals coming
  512. >from the mouse at a lower level than the usual
  513. >event mechanism.
  514.  
  515. "Somehow" is the word. I can't see any doumentation that tells us how
  516. to go this way.
  517.  
  518. >(2) Periodically reset the pointer location to
  519. >the middle of the screen.
  520.  
  521. This is what I did in HeartQuest. I'm not sure if it's the most portable
  522. one (though it seems to work on all present Macs - anyone know if it works
  523. with A/UX?) but it's pretty easy. The drawback is that I have to deped
  524. on a global that might go away some time.
  525.  
  526. >There doesn't seem to be any official way of
  527. >doing either of these. Does anyone know how
  528. >the trick is usually done, and what is the
  529. >least non-portable way of going about it?
  530.  
  531. It would really be nice if Apple could tell us what we should do when we
  532. *have* to do it. How about a mechanism that will ONLY work when the cursor
  533. is hidden? Then we won't break the interface rules as badly - if at all!
  534.  
  535. --
  536. - -
  537. Ingemar Ragnemalm, PhD
  538. Image processing, Mac shareware games
  539. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  540.  
  541. +++++++++++++++++++++++++++
  542.  
  543. >From casadygree@aol.com (CasadyGree)
  544. Date: 28 Nov 1994 10:20:32 -0500
  545. Organization: America Online, Inc. (1-800-827-6364)
  546.  
  547. In article <3bb7f5$4r7@cantua.canterbury.ac.nz>,
  548. greg@cosc.canterbury.ac.nz (Greg Ewing) writes:
  549.  
  550. >>>
  551. Various games, such as Oxyd and Wolf 3D, use the
  552. mouse as a relative rather than absolute motion
  553. device.
  554. ...
  555. (2) Periodically reset the pointer location to
  556. the middle of the screen.
  557. >>>
  558.  
  559. That's right.  Glider 4.0 did this in "joystick" mode (for the old Kraft
  560. QuickStick) - every pass through the game check the mouse location from
  561. the center - then center it (this also foiled AfterDark's auto-sleep
  562. feature as well).
  563.  
  564. There's a funtion floating around called SetMouse().  It can be found, for
  565. example, in the UMPG (Usenet Macintosh Programming Guide) available at
  566. reputable FTP sites.  Download the text - there are a lot of other useful
  567. (and some dated) FAQ's in it.
  568.  
  569. john calhoun
  570. (softdoroth@aol.com)
  571.  
  572. +++++++++++++++++++++++++++
  573.  
  574. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  575. Date: 28 Nov 1994 16:51:56 GMT
  576. Organization: (none)
  577.  
  578. casadygree@aol.com (CasadyGree) writes:
  579. >That's right.  Glider 4.0 did this in "joystick" mode (for the old Kraft
  580. >QuickStick) - every pass through the game check the mouse location from
  581. >the center - then center it (this also foiled AfterDark's auto-sleep
  582. >feature as well).
  583.  
  584. Any idea on how compatible it is?
  585.  
  586. >There's a funtion floating around called SetMouse().  It can be found, for
  587. >example, in the UMPG (Usenet Macintosh Programming Guide) available at
  588. >reputable FTP sites.  Download the text - there are a lot of other useful
  589. >(and some dated) FAQ's in it.
  590.  
  591. And here is one version of it:
  592.  
  593. procedure SetMouse (where: point);
  594.         var
  595.                 LowGlob: integer;
  596.                 LowMem: ptr;
  597.                 PointPtr: ^point;
  598.         const
  599. {some dangerous low-memory-global equates}
  600.                 MTemp = $828;        {point}
  601.                 RawMouse = $82c;     {point}
  602.                 CrsrNew = $8ce;      {byte}
  603.         begin
  604.                 LocalToGlobal(where);             {Get ready to restore old mouse position}
  605.                 LowMem := pointer(RawMouse);      {point to low memory}
  606.                 PointPtr := @LowMem^;             {treat it as a point}
  607.                 PointPtr^ := where;               {store saved mouse position into it}
  608.                 LowMem := pointer(MTemp);         {point to low memory}
  609.                 PointPtr := @LowMem^;             {treat it as a point}
  610.                 PointPtr^ := where;               {store saved mouse position into it}
  611.                 LowMem := pointer(CrsrNew);
  612.                 LowMem^ := $ffff;                 {both CrsrNew & CrsrCouple}
  613.         end;       {SetMouse}
  614.  
  615. This is what I use in SAT/HeartQuest/Slime Invaders. I didn't write it; it's
  616. taken from UMPG or from a post here. Sorry for the bad capitalization; I
  617. never bothered to fix that.
  618.  
  619. --
  620. - -
  621. Ingemar Ragnemalm, PhD
  622. Image processing, Mac shareware games
  623. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  624.  
  625. +++++++++++++++++++++++++++
  626.  
  627. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  628. Date: 29 Nov 1994 01:00:22 GMT
  629. Organization: University of Canterbury, Christchurch, New Zealand
  630.  
  631.  
  632. In article <3bcbio$n2q@newsy.ifm.liu.se>, ingemar@lysator.liu.se (Ingemar Ragnemalm) writes:
  633. |> 
  634. |> It would really be nice if Apple could tell us what we should do when we
  635. |> *have* to do it.
  636.  
  637. What would be really nice for this problem would
  638. be to receive "raw mouse moved" events. These would
  639. be disabled by default, but when requested, would
  640. tell you every time the mouse was moved (regardless
  641. of whether the pointer is at the edge of the screen
  642. or not) and how much it has moved since the last
  643. such event.
  644.  
  645. I wonder if it would be possible to create a
  646. custom ADB device driver which does this?
  647. Is there any information around about how to
  648. write ADB drivers? If the ADB interface is stable
  649. enough, it might allow us to create a "relative
  650. mouse extension" that would be more reliable
  651. than messing with low memory globals.
  652.  
  653. |> Ingemar Ragnemalm, PhD
  654. |> E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  655.  
  656. Greg Ewing, Computer Science Dept, +--------------------------------------+
  657. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  658. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  659. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  660.  
  661. +++++++++++++++++++++++++++
  662.  
  663. >From lrucker@parcplace.com (Lee Ann Rucker)
  664. Date: Wed, 30 Nov 1994 11:59:57 +0800
  665. Organization: ParcPlace
  666.  
  667. In article <3bcbio$n2q@newsy.ifm.liu.se>, ingemar@lysator.liu.se (Ingemar
  668. Ragnemalm) wrote:
  669.  
  670. > >(2) Periodically reset the pointer location to
  671. > >the middle of the screen.
  672. > This is what I did in HeartQuest. I'm not sure if it's the most portable
  673. > one (though it seems to work on all present Macs - anyone know if it works
  674. > with A/UX?) but it's pretty easy. The drawback is that I have to deped
  675. > on a global that might go away some time.
  676. > >There doesn't seem to be any official way of
  677. > >doing either of these.
  678.  
  679. There is an official way, if the machine has the CursorDevice Manager. 
  680. This comes from my PowerMac specific code - I haven't written the Gestalt
  681. check yet, I still use low mem globals for 68k.
  682.  
  683.                 /* Check Gestalt here for 68k (all PowerMacs have it) */
  684.                 if (!gCrsrDevice) do {
  685.                         CrsrDevNextDevice(&gCrsrDevice);
  686.                 } while (gCrsrDevice && (gCrsrDevice->devClass != kDeviceClassMouse));
  687.  
  688.  
  689. ...
  690.  
  691.  
  692.         if (gCrsrDevice) {
  693.                 CrsrDevMoveTo(gCrsrDevice, newPT.h, newPT.v);
  694.  }
  695.  else {
  696.         /* set using low memory globals */
  697.  }
  698.  
  699. +++++++++++++++++++++++++++
  700.  
  701. >From richard@rfbl.demon.co.uk (Richard Bleasdale)
  702. Date: Tue, 6 Dec 1994 04:02:57 GMT
  703. Organization: Demon Internet
  704.  
  705. In article <3bb7f5$4r7@cantua.canterbury.ac.nz>, greg@cosc.canterbury.ac.nz
  706. (Greg Ewing) wrote:
  707.  
  708. > Various games, such as Oxyd and Wolf 3D, use the
  709. > mouse as a relative rather than absolute motion
  710. > device. That is, moving the mouse causes some
  711. > corresponding motion in the game, but there is
  712. > no limit of the mouse hitting the edge of the
  713. > screen.
  714. > How is this accomplished? Two approaches I
  715. > can think of are:
  716. > (1) Somehow intercept the motion signals coming
  717. > from the mouse at a lower level than the usual
  718. > event mechanism.
  719. > (2) Periodically reset the pointer location to
  720. > the middle of the screen.
  721. > There doesn't seem to be any official way of
  722. > doing either of these. Does anyone know how
  723. > the trick is usually done, and what is the
  724. > least non-portable way of going about it?
  725. > Greg Ewing, Computer Science Dept, +--------------------------------------+
  726. > University of Canterbury,        | A citizen of NewZealandCorp, a       |
  727. > Christchurch, New Zealand        | wholly-owned subsidiary of Japan Inc.|
  728. > greg@cosc.canterbury.ac.nz       +--------------------------------------+
  729.  
  730. // I use this stuff in my code...
  731. //I cant remember how it works...But it still works on PowerPC
  732. void    StillMouseIncrement(Point*,Point*);
  733. void    StillMouseIncrement(Here,Inc)
  734. Point   *Here,*Inc;
  735. {/* see MacTutor July 1989 p 88 'Cursor Control' by Robert Gibson*/
  736. Point   *MTemp=(Point*)0x828,*RawMouse=(Point*)0x82c,*Mouse=(Point*)0x830;
  737. short   *CrsrNew=(short*)0x8ce;
  738. *Inc=*MTemp;
  739. Inc->v-=Here->v;
  740. Inc->h-=Here->h;
  741. *MTemp=*Here;
  742. *RawMouse=*Here;
  743. *Mouse=*Here;
  744. *CrsrNew=-1;
  745. }
  746.  
  747. Richard Bleasdale
  748. richard@rfbl.demon.co.uk
  749.  
  750. ---------------------------
  751.  
  752. >From ekstrom@aggroup.com (Harold Ekstrom)
  753. Subject: How to convert a Picture to a PixPat?
  754. Date: Wed, 30 Nov 1994 18:54:28 -0800
  755. Organization: Ag Group
  756.  
  757.  
  758. I'm trying to convert a pict (from the clipboard copied from the
  759. System 7.5 Desktop Patterns control panel) to a PixPat.
  760. Any help?
  761.  
  762. Thanks,
  763. harold
  764. - ------------------------------------------------------------
  765. Harold Ekstrom
  766. ekstrom@aggroup.com
  767. ag group, inc.
  768. 2540 camino diablo, suite 200
  769. walnut creek, ca 94596
  770. 510-937-7900 voice
  771. 510-937-2479 fax
  772. 510-937-6704 ara
  773. ftp.aggroup.com anonymous ftp
  774.  
  775.  
  776. +++++++++++++++++++++++++++
  777.  
  778. >From bhorling@trincoll.edu (Bryan Horling)
  779. Date: Sat, 03 Dec 1994 11:49:46 -0500
  780. Organization: Trinity College
  781.  
  782. In article <ekstrom-3011941854280001@harold.aggroup.com>,
  783. ekstrom@aggroup.com (Harold Ekstrom) wrote:
  784.  
  785. > I'm trying to convert a pict (from the clipboard copied from the
  786. > System 7.5 Desktop Patterns control panel) to a PixPat.
  787. > Any help?
  788.  
  789. You should just be able to paste it into a ppat resource (assumming it's <
  790. 64x64).  I think the Desktop Patterns are already in ppat resources in the
  791. first place, so if you opened it up with ResEdit you could cut & paste
  792. them directly into your program.
  793.  
  794. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  795.        --Bryan Horling--       |  >>bhorling@mail.trincoll.edu<<
  796.        -Head Consultant-       |     Trinity College, #701235
  797.   "Do not use GAK on varnished |     300 Summit St
  798.     on unvarnished surfaces"   |     Hartford, CT 06106-3100
  799. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  800.                 http://shakti.trincoll.edu/~bhorling
  801.  
  802. +++++++++++++++++++++++++++
  803.  
  804. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  805. Date: Tue, 6 Dec 1994 17:40:16 GMT
  806. Organization: Apple Computer
  807.  
  808. Harold Ekstrom, ekstrom@aggroup.com writes:
  809. > I'm trying to convert a pict (from the clipboard copied from the
  810. > System 7.5 Desktop Patterns control panel) to a PixPat.
  811. > Any help?
  812.  
  813. You need to draw the picture into an offscreen GWorld of the proper
  814. dimensions, and then stuff the GWorld's PixMap into the PixPat. The hard part
  815. of this is figuring out the proper color table to use for the PixMap -- I had
  816. to write this stuff by hand for Wallpaper, but fortunately 7.0 and later
  817. include the Picture Utilities that will do things like generate a good color
  818. table for a PICT.
  819.  
  820. --Jens Alfke                           jens_alfke@powertalk.apple.com
  821.                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  822.  
  823. ---------------------------
  824.  
  825. >From markr@owl-uk.co.uk (Mark Rogers)
  826. Subject: Info on BlockMoveData ?
  827. Date: Tue, 29 Nov 1994 15:27:25 GMT
  828. Organization: Office Workstations Ltd.
  829.  
  830. Does anyone know where I can get some information on the BlockMoveData
  831. trap. Specifically I want to know when it's safe to call and which
  832. systems it's available on. 
  833.  
  834. The only reference I can find is in Tech Note OS 05 "System Update 3.0"
  835. but I seem to recall seeing a more complete discussion sometime in the
  836. last 12 months.
  837.  
  838. Thanks,
  839.  
  840.     Mark Rogers (all opinions are my own)     
  841.     Office Workstations Ltd.
  842.     Edinburgh, UK
  843.     markr@owl-uk.co.uk
  844.  
  845.  
  846. +++++++++++++++++++++++++++
  847.  
  848. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  849. Date: Tue, 29 Nov 1994 14:45:10 -0600
  850. Organization: Univ of Wisc-Madison, Dept of Biochemistry
  851.  
  852. In article <D01C9p.D06@owl-uk.co.uk>, markr@owl-uk.co.uk (Mark Rogers) wrote:
  853.  
  854. > Does anyone know where I can get some information on the BlockMoveData
  855. > trap. Specifically I want to know when it's safe to call and which
  856. > systems it's available on. 
  857. > The only reference I can find is in Tech Note OS 05 "System Update 3.0"
  858. > but I seem to recall seeing a more complete discussion sometime in the
  859. > last 12 months.
  860.  
  861. It's always safe to call.  If it isn't present, then the regular,
  862. instruction cache flushing BlockMove is called.
  863.  
  864. I believe the only reference to BlockMoveData _is_ the tech note that you cite.
  865.  
  866. Ken Prehoda
  867. Department of Biochemistry
  868. University of Wisconsin-Madison
  869. kenp@nmrfam.wisc.edu
  870.  
  871. +++++++++++++++++++++++++++
  872.  
  873. >From larson@base.cs.ucla.edu (Christopher Larson)
  874. Date: 29 Nov 1994 22:45:38 GMT
  875. Organization: UCLA, Computer Science Department
  876.  
  877. In article <D01C9p.D06@owl-uk.co.uk> markr@owl-uk.co.uk (Mark Rogers) writes:
  878. >Does anyone know where I can get some information on the BlockMoveData
  879. >trap. Specifically I want to know when it's safe to call and which
  880. >systems it's available on. 
  881. >
  882. >The only reference I can find is in Tech Note OS 05 "System Update 3.0"
  883. >but I seem to recall seeing a more complete discussion sometime in the
  884. >last 12 months.
  885.  
  886. BlockMoveData() is just BlockMove() with one of the trap selector bits
  887. (or whatever those bits are called -- the same ones you use for SYS and
  888. CLEAR Memory Manager calls) set. This bit tells the OS that code was not
  889. moved so the instruction cache need not be flushed.
  890.  
  891. BlockMoveData() is just as safe as BlockMove(); you can use it at interrupt
  892. time, etc. Because BlockMoveData() uses the same trap as BlockMove(), it can
  893. be used on _any_ system. BlockMoveData() is implemented by extending the
  894. existing BlockMove() routine to examine this slector bit and change its
  895. cache flushing behavior acordingly. Thus, if BlockMoveData() is not
  896. implemented, a normal BlockMove() will occur, including the cache flush
  897. if the block was 12 (I think) bytes or longer.
  898.  
  899. BlockMoveData() is implemented in System Update 3.0 (as I'm sure you
  900. know) and System 7.5 (I think).
  901.  
  902. The only place I know that any of this is documented is the Tech Note you
  903. mention above. There was some discussion here (well, in csmp anyway) a
  904. while ago but I don't recall any official source of information entering
  905. the discussion.
  906.  
  907. Sorry about all the "I think"s, I'm away from my Mac at the moment.
  908.  
  909. --Chris
  910. _______________________________________________________________________________
  911. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  912. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  913. Death to the Trojans! Go Bruins!
  914.  
  915. (Insert disclaimer here)
  916. Internet: larson@kingston.cs.ucla.edu
  917.  
  918. +++++++++++++++++++++++++++
  919.  
  920. >From jwbaxter@olympus.net (John W. Baxter)
  921. Date: Tue, 29 Nov 1994 14:05:42 -0800
  922. Organization: Internet for the Olympic Peninsula
  923.  
  924. In article <D01C9p.D06@owl-uk.co.uk>, markr@owl-uk.co.uk (Mark Rogers) wrote:
  925.  
  926. > Does anyone know where I can get some information on the BlockMoveData
  927. > trap. Specifically I want to know when it's safe to call and which
  928. > systems it's available on. 
  929.  
  930. BlockMoveData is safe to call anytime BlockMove is, unless what you are
  931. moving is object code.  BlockMoveData's job is to not flush the
  932. instruction cache on 68040 machines.  The trap differs from the BlockMove
  933. trap in only one bit...ROMs which don't know about BlockMoveData don't
  934. notice the bit, and execute BlockMove.
  935. --John
  936.  
  937. -- 
  938. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  939.    Sorry...clever signatures require cleverness, not found here.
  940.    jwbaxter@pt.olympus.net
  941.  
  942. ---------------------------
  943.  
  944. >From ftoth@cybernetics.net (Fred Toth)
  945. Subject: Installer advice please?
  946. Date: 2 Dec 1994 02:19:10 GMT
  947. Organization: Cybernetx, Inc.
  948.  
  949. Hi folks. We needed a slick installation package for our application
  950. some time ago. We looked briefly at the Apple installer stuff, but
  951. quickly settled on Stuffit Installer Maker from Aladdin (Great product!).
  952.  
  953. Now, of course, things have gotten more complicated, and we're 
  954. looking for solutions again. We need to do some things that Installer
  955. Maker won't do.
  956.  
  957. Could anyone advise on these issues:
  958.  
  959. 1. We know we can add functionality to Installer Maker by linking in
  960. C modules. How does this compare with off-the-shelf functionality
  961. available from Apple's installer?
  962.  
  963. 2. Putting together installation packages in Installer Maker is a snap.
  964. I've heard that creating Apple installer scripts is painful. Any comments?
  965.  
  966. 3. Are there other products out there that we should consider?
  967.  
  968. Many thanks,
  969.  
  970. Fred Toth, ftoth@cybernetics.net
  971.  
  972. +++++++++++++++++++++++++++
  973.  
  974. >From bsutter@aol.com (BSUTTER)
  975. Date: 7 Dec 1994 00:30:14 -0500
  976. Organization: America Online, Inc. (1-800-827-6364)
  977.  
  978. In article <3bm06u$cfb@jabba.cybernetics.net>, ftoth@cybernetics.net (Fred
  979. Toth) writes:
  980.  
  981. Hi!
  982. I work for MindVision software in Lincoln, NE
  983. (402)477-3269
  984. We have an installer application similar to InstallerMaker with MANY
  985. additional features.
  986. You can set up to 96 different packages.
  987. You can call external codes before and after every file that gets
  988. installed, so you can modify the file after it's installed, or whatever.
  989. You can get a full working version of the installer to try it out by
  990. calling Mindvision at the above phone number. All it does is bring up a
  991. slash screen saying it is an unauthorized copy, or something like that.
  992.  
  993. It's called Developer VISE. Several major companies are using it including
  994. Intuit, Adobe, Apple (for internal software), Symantec, ...
  995.  
  996. Hope this helps,
  997.  
  998. Brian Sutter
  999.  
  1000.  
  1001. +++++++++++++++++++++++++++
  1002.  
  1003. >From johannaa@eworld.com (Johanna Andrews)
  1004. Date: Fri, 09 Dec 1994 17:28:15 -0700
  1005. Organization: Apple Computer
  1006.  
  1007. In article <3bm06u$cfb@jabba.cybernetics.net>, ftoth@cybernetics.net (Fred
  1008. Toth) wrote:
  1009.  
  1010. > Hi folks. We needed a slick installation package for our application
  1011. > some time ago. We looked briefly at the Apple installer stuff, but
  1012. > quickly settled on Stuffit Installer Maker from Aladdin (Great product!).
  1013. > Now, of course, things have gotten more complicated, and we're 
  1014. > looking for solutions again. We need to do some things that Installer
  1015. > Maker won't do.
  1016. > Could anyone advise on these issues:
  1017. > 1. We know we can add functionality to Installer Maker by linking in
  1018. > C modules. How does this compare with off-the-shelf functionality
  1019. > available from Apple's installer?
  1020. > 2. Putting together installation packages in Installer Maker is a snap.
  1021. > I've heard that creating Apple installer scripts is painful. Any comments?
  1022. > 3. Are there other products out there that we should consider?
  1023. > Many thanks,
  1024. > Fred Toth, ftoth@cybernetics.net
  1025.  
  1026. Hi Fred,
  1027.  
  1028. Regarding Issue #1 - I've linked C modules into Apple installers, but
  1029. not Aladdin installers.  However, based on looking over Aladdin's
  1030. documentation,
  1031. I'd say Aladdin's functionality is roughly comparable with respect to this
  1032. feature.
  1033.  
  1034. Regarding issue #2 - The first time you create an Apple Installer it's
  1035. painful (fairly steep learning curve), but once you've written one
  1036. installer script it's not too bad.  One advantage the Aladdin installer
  1037. offers is that compression is automatic while the Apple installer requires
  1038. that files be compressed separately if compression is desired, using a
  1039. separate compression tool (such as InstaCompOne, which I believe is
  1040. included in the Installer 4.0.3 SDK).  Also, Aladdin Installers I have
  1041. created have been smaller and faster than analagous Apple Installers when
  1042. compression was necessary.
  1043.  
  1044. It used to be that InstallerMaker had significantly fewer features than
  1045. Apple's installer and was less flexible, but in the 2.0 version, Aladdin is
  1046. catching up.  However, Apple's custom install interface is still much more
  1047. configurable than Aladdin's.  Also, you can create updaters with the Apple
  1048. Installer (merging resources into existing files is supported) but not with
  1049. InstallerMaker.
  1050.  
  1051. I can't address issue #3, since I haven't checked out any other products.
  1052.  
  1053. In general, I would recommend that you figure out exactly what your
  1054. installer
  1055. needs to do and then find the package that offers the features you require
  1056. for the best price.
  1057.  
  1058. Good Luck,
  1059.  
  1060. Johanna Andrews
  1061. johannaa@eworld.com
  1062.  
  1063. ---------------------------
  1064.  
  1065. >From h+@metrowerks.com (Jon W{tte)
  1066. Subject: Mac FAQ now available as HTML using WWW!
  1067. Date: Mon, 05 Dec 1994 22:32:08 +0100
  1068. Organization: The Conspiracy
  1069.  
  1070. There are some issues about the FAQ:
  1071.  
  1072. 1) Someone keeps posting old and outdated versions of the FAQ 
  1073. questions in the info group. The real FAQ is only posted in 
  1074. comp.sys.mac.programmer, comp.answers and news.answers, and 
  1075. available for ftp on rtfm.mit.edu and nada.kth.se.
  1076.  
  1077. 2) The FAQ is now available as HTML document, either using 
  1078. ftp://ftp.nada.kth.se/pub/hacks/mac-faq/mac-faq.html OR from my 
  1079. home page http://www.nada.kth.se/~d88-jwa.
  1080.  
  1081. The HTML version is parsed from the "real" version using a 
  1082. simple parser I wrote, so there may be strangenesses or 
  1083. inelegancies. Please report them to me.
  1084.  
  1085. 3) The new co-maintainer and butler of the FAQ is Chris; 
  1086. THUNDERONE@Delphi.com. Mail your bug reports, requests etc to 
  1087. him; he collects it all and sends me a new, updated FAQ once a 
  1088. month.
  1089.  
  1090. Cheers,
  1091.  
  1092.                                 / h+
  1093.  
  1094.  
  1095. --
  1096.   Jon Wdtte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  1097.    Had I known that I would program Macintosh for a living
  1098.    maybe I would have turned away from computers altogether.
  1099.                                             -- Hao-yang Wang
  1100.  
  1101.  
  1102. ---------------------------
  1103.  
  1104. >From zviki@techunix.technion.ac.il (Zviki Cohen)
  1105. Subject: PowerPlant vs. MacApp - opinions ?
  1106. Date: Wed, 9 Nov 1994 08:42:38 GMT
  1107. Organization: TECHNION - Izrael Institute of Technology
  1108.  
  1109.         Hello !
  1110.  
  1111.         Well, the title says most of it - I'm about to start a project using
  1112. CodeWarrior and I can choose to use either PowerPlant or MacApp. Which one is
  1113. better ?  Are there any major diffrences that anyone can point out ?
  1114.  
  1115.                 TIA,
  1116.                                 Zviki Cohen
  1117.  
  1118.  
  1119.  
  1120. +++++++++++++++++++++++++++
  1121.  
  1122. >From jwbaxter@olympus.net (John W. Baxter)
  1123. Date: Wed, 09 Nov 1994 10:25:02 -0800
  1124. Organization: Internet for the Olympic Peninsula
  1125.  
  1126. In article <Cyzs73.1uq@discus.technion.ac.il>,
  1127. zviki@techunix.technion.ac.il (Zviki Cohen) wrote:
  1128.  
  1129. >         Hello !
  1130. >         Well, the title says most of it - I'm about to start a project using
  1131. > CodeWarrior and I can choose to use either PowerPlant or MacApp. Which one is
  1132. > better ?  Are there any major diffrences that anyone can point out ?
  1133.  
  1134. MacApp:   Solid, stolid old code (more than 10 years old in concept...it
  1135. was being worked on before first Mac release).  At the same time, it's
  1136. based on oldish design ideas, and it has fallen behind the new additions
  1137. to the Mac Op Sys (can't say "Mac OS" any more without a license). 
  1138. [Version 3.5 will somewhat catch up.]  Essentially based on a tree
  1139. structure of classes (although your own code need not be part of the
  1140. tree...you can use your own classes not based on TObject if you like, and
  1141. it's often best for the "engine" part of your code).  Can build for System
  1142. 6 (if that matters to you).
  1143.  
  1144. PowerPlant:  Fresh and new, still evolving.  Based on a forest structure,
  1145. and the dependencies between classes are reduced as much as possible. 
  1146. [You can pick up the menu handling and use just that in your own app, just
  1147. as an example...no easy way to do that with MacApp.]  PP apps are
  1148. scriptable and recordable unless you go out of  your way to break that. 
  1149. Apps require System 7.
  1150.  
  1151. PowerPlant is Greg Dow's second chance to do this (TCL having been the
  1152. first), and he's taking good advantage of the more modern tools at his
  1153. disposal.
  1154.  
  1155. Bottom line:  it depends.
  1156.  
  1157.    --John
  1158.  
  1159. -- 
  1160. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1161.    Sorry...clever signatures require cleverness, not found here.
  1162.    jwbaxter@pt.olympus.net
  1163.  
  1164. +++++++++++++++++++++++++++
  1165.  
  1166. >From red.riders
  1167. Date: Thu, 10 Nov 1994 00:53:57 -0500
  1168. Organization: DSC/Voicenet - BBS/Unix Shells/SLIP/NEWS - (215)443-7390
  1169.  
  1170. In article <jwbaxter-0911941025020001@ptpm002.olympus.net>,
  1171. jwbaxter@olympus.net (John W. Baxter) wrote:
  1172.  
  1173. > Bottom line:  it depends.
  1174.  
  1175. Yeah, on when you actually want to ship your app.
  1176.  
  1177. This is not a knock on PP. It simply is not yet
  1178. ready to do big time apps. Yet. MacApp today is
  1179. by FAR the best Mac framework solution available. Con-
  1180. trary to popular belief, it really isn't even a 
  1181. close race, unless you're making an app that has
  1182. relatively limited scope (like some sort of utility).
  1183.  
  1184. I would use anything that was better. I have no
  1185. hidden agendas against TCL or PP. Both have their
  1186. good points. I used TCL before MacApp in order to
  1187. avoid having to climb MacApp's (overstated) learning
  1188. curve. And I seriously examined PP and it's "modern"
  1189. approach to application design. Shows good promise, but it
  1190. simply is not yet something I would rely upon, or stake
  1191. my reputation upon when delivering a product.
  1192.  
  1193. Forget the "forest" and "monolithic" garbage. It doesn't
  1194. matter in a big app, particularly when the monolith is
  1195. a giant body of code that you never have to change.
  1196.  
  1197. Apple wants you to write OpenDoc parts; so they are telling
  1198. you that monolithic OOP frameworks are dinosaurs. Keep in
  1199. mind that Apple also told you that 040's were dinosaurs
  1200. the day PPC machines shipped. Still selling plenty 040 boxes
  1201. though.
  1202.  
  1203. Don't believe their hogwash, unless you plan on
  1204. writing something today that 0.0% of Mac users are currently
  1205. waiting for (OpenDoc parts). If you can wait 3 years to get
  1206. paid, then write OD parts. If you want to ship an app in 3-6
  1207. months, then MacApp is like having a ticket on the Concorde.
  1208.  
  1209. You will not believe how fast a MacApp application comes together.
  1210.  
  1211. Schedules are measured in days, not months. You can struggle with
  1212. PP today, and be an expert. OR you could ship product NOW, and
  1213. learn PP when it's API stops changing, and is stable enough to
  1214. take seriously.
  1215.  
  1216. MacApp is remarkably detailed, solid, and capable.
  1217. PP is really years away from this level of polish, and those
  1218. who are using it today are hampered by the amount of
  1219. stuff they have to write (and debug!) that MacApp users
  1220. have taken for granted for years. Tons and tons of services
  1221. are in MacApp, that PP may never have.
  1222.  
  1223. PP is catching up to MacApp faster than MacApp is pulling
  1224. away. Soon the choice will be a tough one. But not today.
  1225. The best thing to do is learn a bit about PP, and it's
  1226. ways and methodologies. Plan on possibly migrating to PP in the
  1227. future. Maybe you won't ever do it, but good OOP design will
  1228. allow your classes to function under EITHER framework; IF you
  1229. plan, design, and code your stuff with this mindset.
  1230.  
  1231. SOLID knowledge and use of C++ will help you a lot. Worth the effort.
  1232. Whatever you do though, USE CODEWARRIOR!!!!
  1233.  
  1234. the red riders!
  1235.  
  1236. +++++++++++++++++++++++++++
  1237.  
  1238. >From dkevery@aol.com (DKEvery)
  1239. Date: 10 Nov 1994 13:20:07 -0500
  1240. Organization: America Online, Inc. (1-800-827-6364)
  1241.  
  1242. Also...
  1243.  
  1244. MacApp abstracts you MORE from the toolbox (not completely, but
  1245. more-so).... and has more layers, and is a more full featured FrameWork
  1246. (not better, just more abstracted and more to learn).
  1247.  
  1248. For the most part if you are learning a framework and come from Mac
  1249. Programming... the PowerPlant will be much easier and better.... if you
  1250. are coming from heavy OOP and don't understand Mac programming (and have
  1251. to learn everything anyways)... then MacApp is probably better.
  1252.  
  1253. +++++++++++++++++++++++++++
  1254.  
  1255. >From aberno@genome.stanford.edu (Anthony Berno)
  1256. Date: Thu, 10 Nov 1994 13:31:34 -0800
  1257. Organization: Stanford DNA Sequence and Technology Center
  1258.  
  1259. In article
  1260. <red.riders-1011940053570001@slip-199-234-232-125.voicenet.com>,
  1261. red.riders wrote:
  1262.  
  1263. > In article <jwbaxter-0911941025020001@ptpm002.olympus.net>,
  1264. > jwbaxter@olympus.net (John W. Baxter) wrote:
  1265. > > Bottom line:  it depends.
  1266. > Yeah, on when you actually want to ship your app.
  1267.  
  1268. Unfortunately, this is true. PP, although it is a nice start, is a very
  1269. thin and cantankerous framework. Although it is much better than TCL
  1270. (which is, imho, a creeping horror that deserves to die) I would have been
  1271. much better off with MacApp in my current project, and I wish I had
  1272. started with that instead of PP.
  1273.  
  1274. The main problem is that the classes are not abstract enough - you still
  1275. have to dig around in the internals. For example, in using a popup menu, I
  1276. actually have to fiddle with the menu handle! That sucks! And, I've been
  1277. trying for half an hour to get my popup to show a particular item when it
  1278. is first created, and I can't manage it. Aargh!
  1279.  
  1280. Also, the classes are not very robust. For example, if you forget to call
  1281. UDesktop::Deactivate and UDesktop::Activate before and after a call that
  1282. generates a modal dialog, your desktop will be permanently screwed, and
  1283. won't figure out by itself that something is wrong.
  1284.  
  1285. I haven't actually *written* anything with MacApp, but unless PP gets a
  1286. lot better, I'm not going to use it for my next project. Even though
  1287. MacApp doesn't seem to support AEOM, it looks like the better choice. 
  1288.  
  1289. (Actually, I'd rather be using Dylan. ;-)
  1290.  
  1291. > SOLID knowledge and use of C++ will help you a lot. Worth the effort.
  1292. > Whatever you do though, USE CODEWARRIOR!!!!
  1293.  
  1294. Hear hear. Excellent advice.
  1295.  
  1296. -Anthony
  1297.  
  1298. +++++++++++++++++++++++++++
  1299.  
  1300. >From Jaeger@fquest.com (Brian Stern)
  1301. Date: 11 Nov 1994 04:12:11 GMT
  1302. Organization: The University of Texas at Austin, Austin, Texas
  1303.  
  1304. In article <aberno-1011941331340001@lyapunov.stanford.edu>,
  1305. aberno@genome.stanford.edu (Anthony Berno) wrote:
  1306.  
  1307. < The main problem is that the classes are not abstract enough - you still
  1308. < have to dig around in the internals. For example, in using a popup menu, I
  1309. < actually have to fiddle with the menu handle! That sucks! And, I've been
  1310. < trying for half an hour to get my popup to show a particular item when it
  1311. < is first created, and I can't manage it. Aargh!
  1312. Try this:      
  1313.  
  1314. thePopUp->SetValue( 5 );//Sets the popup to the 5th item in the menu
  1315.  
  1316. Although I will say that LListBox has no methods for adding rows
  1317. or columns.
  1318.  
  1319. < Also, the classes are not very robust. For example, if you forget to call
  1320. < UDesktop::Deactivate and UDesktop::Activate before and after a call that
  1321. < generates a modal dialog, your desktop will be permanently screwed, and
  1322. < won't figure out by itself that something is wrong.
  1323.  
  1324. This is mentioned in the docs and one of the sample apps.
  1325.  
  1326. < -Anthony
  1327.  
  1328. -- 
  1329. Brian  Stern  :-{)}
  1330. Toolbox commando and Menu bard
  1331. Jaeger@fquest.com
  1332.  
  1333. +++++++++++++++++++++++++++
  1334.  
  1335. >From scouten@uiuc.edu (Eric Scouten)
  1336. Date: Fri, 11 Nov 1994 10:08:28 -0600
  1337. Organization: University of Illinois
  1338.  
  1339. In article <Jaeger-1011942216470001@slip-23-2.ots.utexas.edu>,
  1340. Jaeger@fquest.com (Brian Stern) wrote:
  1341.  
  1342. > In article <aberno-1011941331340001@lyapunov.stanford.edu>,
  1343. > aberno@genome.stanford.edu (Anthony Berno) wrote:
  1344. > < The main problem is that the classes are not abstract enough - you still
  1345. > < have to dig around in the internals. For example, in using a popup menu, I
  1346. > < actually have to fiddle with the menu handle! That sucks!
  1347.  
  1348. Really. I actually rather like it. It's part of what makes PowerPlant a
  1349. nice, lightweight class library.
  1350.  
  1351. -es
  1352.  
  1353. __________________________________________________________________________
  1354. Eric Scouten <scouten@uiuc.edu> * MS Comp Sci '96, Univ of Illinois
  1355.  
  1356. IMPORTANT NOTICE TO READERS: The entire physical universe, including this
  1357. message, may one day collapse back into an infinitesimally small space.
  1358. Should another universe subsequently re-emerge, the existence of this message
  1359. cannot be guaranteed.
  1360.    -with apologies to Devine & Cohen (Absolute Zero Gravity)
  1361.  
  1362. +++++++++++++++++++++++++++
  1363.  
  1364. >From sw@network-analysis-ltd.co.uk (Sak Wathanasin)
  1365. Date: Sat, 12 Nov 94 21:24:37 GMT
  1366. Organization: Network Analysis Ltd
  1367.  
  1368.  
  1369. In article <1994Nov11.221337.1940@newsserver.rrzn.uni-hannover.de> 
  1370. (comp.sys.mac.programmer.codewarrior,comp.sys.mac.programmer), 
  1371. McCammond@sgi.siemens.com (McCammond) writes:
  1372.  
  1373. > If the design ideas in
  1374. > PowerPlant had been incorporated into the application I'm working on (a
  1375. > 500,000 line MacApp application--yes 500,000 lines) when it was
  1376. > created, then I would have a lot fewer headaches.
  1377.  
  1378. So are you converting that 500K line appl to PP? If so, how did you fare? If 
  1379. not, why not?
  1380.  
  1381. Sak Wathanasin
  1382. Network Analysis Limited
  1383. 178 Wainbody Ave South, Coventry CV3 6BX, UK
  1384.  
  1385. Internet: sw@network-analysis-ltd.co.uk 
  1386. uucp:     ...!uknet!nan!sw                       AppleLink: NAN.LTD
  1387. Phone: (+44) 203 419996 Mobile:(+44) 850 587411  Fax: (+44) 203 690690
  1388.  
  1389. +++++++++++++++++++++++++++
  1390.  
  1391. >From aberno@genome.stanford.edu (Anthony Berno)
  1392. Date: Mon, 14 Nov 1994 09:45:14 -0800
  1393. Organization: Stanford DNA Sequence and Technology Center
  1394.  
  1395.  
  1396. In article <Jaeger-1011942216470001@slip-23-2.ots.utexas.edu>,
  1397. Jaeger@fquest.com (Brian Stern) wrote:
  1398.  
  1399. > Try this:      
  1400. > thePopUp->SetValue( 5 );//Sets the popup to the 5th item in the menu
  1401.  
  1402. ...Except, of course, this didn't work. The reason it didn't work cuts to
  1403. the core of what I've been trying to say about the design of PowerPlant.
  1404.  
  1405. Because I had a popup whose contents were not determined until runtime, I
  1406. had to add items to the popup. Because there is no method for doing this,
  1407. I had to add it to the Mac menu directly, using GetMacMenuH() to retrieve
  1408. it.
  1409.  
  1410. The menu started out with zero items, so of course the value in mMaxValue
  1411. was zero. When adding values to the menu handle, I forgot to also update
  1412. the value in mMaxValue, thus causing the object to be in an internally
  1413. inconsistent state.
  1414.  
  1415. When I tried to use SetValue(), it said, "Oh, that is greater than the
  1416. maximum value of zero, so I will set the popup menu's value to zero
  1417. without telling the programmer about it."
  1418.  
  1419. This is an easy mistake to make, and it came about ***because the
  1420. encapsulation of the class was broken by forcing me to access the menu
  1421. handle***. 
  1422.  
  1423. The exposure of the MenuHandle goes against the most basic principles of
  1424. object-oriented design. The WHOLE POINT of having objects is so that you
  1425. can do things without having to worry about maintaining their internal
  1426. state. This is much more important than polymorphism, multiple
  1427. inheritance, or any other object-oriented feature. While I respect a lot
  1428. of things that Greg Dow has done, and I really like a lot of things about
  1429. PowerPlant, things like this waste an enormous amount of time and money. 
  1430.  
  1431. > Although I will say that LListBox has no methods for adding rows
  1432. > or columns.
  1433.  
  1434. Indeed. This results in the same problems I describe above. LListBox has
  1435. such simple behavior, I think it would be easier to implement it without
  1436. the ListManager.
  1437.  
  1438. > < Also, the classes are not very robust. For example, if you forget to call
  1439. > < UDesktop::Deactivate and UDesktop::Activate before and after a call that
  1440. > < generates a modal dialog, your desktop will be permanently screwed, and
  1441. > < won't figure out by itself that something is wrong.
  1442. > < 
  1443. > This is mentioned in the docs and one of the sample apps.
  1444.  
  1445. Documentation is not design, and does not substitute for it.There should
  1446. be consistency checks in UDesktop to catch these things. A major
  1447. difference between a good and bad framework is how often you have to run
  1448. back to the documentation - a good framework does what you expect, with no
  1449. surprises. 
  1450.  
  1451. -Anthony
  1452.  
  1453. +++++++++++++++++++++++++++
  1454.  
  1455. >From aberno@genome.stanford.edu (Anthony Berno)
  1456. Date: Mon, 14 Nov 1994 10:54:41 -0800
  1457. Organization: Stanford DNA Sequence and Technology Center
  1458.  
  1459. In article <1994Nov11.221337.1940@newsserver.rrzn.uni-hannover.de>,
  1460. McCammond@sgi.siemens.com (McCammond) wrote:
  1461.  
  1462. > What the heck, I'll play devil's advocateI
  1463. > (step up on the soap box)
  1464.  
  1465. [lots about PP deleted]
  1466.  
  1467. Yes, to be fair, I have to agree with your points about the design of
  1468. PowerPlant. The intelligent use of multiple inheritance is an enormous
  1469. advantage.
  1470.  
  1471. After all the negativity I've generated, I want to second the notion that
  1472. PP does have a lot going for its future, despite what I consider to be
  1473. some serious problems at present. I hope (dearly!) that PP evolves into
  1474. the robust, elegant framework that it deserves to be.
  1475.  
  1476. -Anthony
  1477.  
  1478. +++++++++++++++++++++++++++
  1479.  
  1480. >From rondavis@datawatch.com (Ron Davis)
  1481. Date: Mon, 14 Nov 1994 15:40:00 -0400
  1482. Organization: Creative Cybernetics -online services (704-549-5553 voice)
  1483.  
  1484. I'm going to jump in on this because I'm taking a break from cursing MPW
  1485. and MacApp.  I just recieved a rather small MacApp app (if there is such a
  1486. thing) that I have to make some modifications to.  It is driving me up the
  1487. wall.  I guess I'm spoiled I've been using PP for the last three or four
  1488. months and it is so much easier.  
  1489.  
  1490. MacApp is too big and complicated.  You have to have a special tool just
  1491. to compile something in it.  PP is lean.  
  1492.  
  1493. You have to have an idea what all of MacApp is doing from the beginning. 
  1494. In PP you only have to learn the parts you are using.
  1495.  
  1496. MacApp has its own special way of handling memory and segments.  PP
  1497. doesn't screw around with the basic structure of a Mac program.  This
  1498. memory thing is why it is so hard to get MacApp to work under
  1499. CodeWarrior.  I understand the people from Symantec got PP running under
  1500. thier system in a matter of hours, where as they never got MacApp to work
  1501. with Think.
  1502.  
  1503. And finally, didn't Apple announce they  weren't going to support MacApp
  1504. anymore?  Or was this a post-Bedrock promise that has been recended?
  1505.  
  1506. Ahhh...I feel better letting a little of that steam.
  1507.  
  1508. ___________________________________________________________________________
  1509. "I want to know God's thoughts...the rest are details."
  1510.                                            -- Albert Einstein
  1511. _________________________________________
  1512. Ron Davis                                  rondavis@datawatch.com        Datawatch, Research Triangle Park, NC      (919)549-0711
  1513.             **** Opinions are MINE, not Datawatch's. ****
  1514.         **** They don't pay me enough to own my opinions ****
  1515.  
  1516. +++++++++++++++++++++++++++
  1517.  
  1518. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1519. Date: 15 Nov 1994 01:29:42 GMT
  1520. Organization: University of Canterbury, Christchurch, New Zealand
  1521.  
  1522.  
  1523. In article <aberno-1411940945140001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  1524. |> 
  1525. |> ...Except, of course, this didn't work. The reason it didn't work cuts to
  1526. |> the core of what I've been trying to say about the design of PowerPlant.
  1527.  
  1528. What you're complaining about doesn't seem to me to be
  1529. a fundamental flaw in the design of PowerPlant. It's
  1530. just a reflection of the fact that the class you're
  1531. using wasn't designed to do what you want.
  1532.  
  1533. Whenever you want to extend a class to do something
  1534. its author hadn't anticipated, you have to be prepared
  1535. to understand some of its internals.
  1536.  
  1537. |> This is an easy mistake to make, and it came about ***because the
  1538. |> encapsulation of the class was broken by forcing me to access the menu
  1539. |> handle***. 
  1540.  
  1541. Make yourself a subclass, and add a method which adds a
  1542. menu item and does whatever is necessary to keep the
  1543. internal state consistent. Now you have a new, properly
  1544. encapsulated class which does what you want. Put it
  1545. away for future use. If you're feeling generous enough,
  1546. post it to the net.
  1547.  
  1548. PowerPlant certainly does not yet do everything
  1549. everyone might want it to do. But you've given no
  1550. reason why the basic structure is not sufficient to
  1551. build upon.
  1552.  
  1553. |> LListBox has
  1554. |> such simple behavior, I think it would be easier to implement it without
  1555. |> the ListManager.
  1556.  
  1557. I can believe that. Recently I added a list view class to a
  1558. framework of my own I've been developing in Object Pascal.
  1559. I didn't even consider using the List Manager - it would
  1560. have taken more contortions just to interface it to my
  1561. object-oriented code than it took to do it all from
  1562. scratch. 
  1563.  
  1564. In today's environment of OO frameworks, it seems to me
  1565. that the List Manager is obsolete. I'd also almost say the
  1566. same thing about the Window and Control managers, insofar
  1567. as much of what they do could have been done much more
  1568. neatly if the whole toolbox had been written in an OO
  1569. language from the beginning, which it should have been!
  1570.  
  1571. |> -Anthony
  1572.  
  1573. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1574. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  1575. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  1576. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  1577.  
  1578. +++++++++++++++++++++++++++
  1579.  
  1580. >From sandvik@apple.com (Kent Sandvik)
  1581. Date: Mon, 14 Nov 1994 22:30:55 -0800
  1582. Organization: Apple Computer, Inc. Developer Technical Support
  1583.  
  1584. In article <3a92u6$io8@cantua.canterbury.ac.nz>,
  1585. greg@cosc.canterbury.ac.nz (Greg Ewing) wrote:
  1586. > In today's environment of OO frameworks, it seems to me
  1587. > that the List Manager is obsolete. I'd also almost say the
  1588. > same thing about the Window and Control managers, insofar
  1589. > as much of what they do could have been done much more
  1590. > neatly if the whole toolbox had been written in an OO
  1591. > language from the beginning, which it should have been!
  1592.  
  1593. They were, actually -- Lisa Toolbox. And there was a reason these were
  1594. rewritten in hand-coded asm in the Mac incarnation. But I agree, CPUs are
  1595. now fast enough to handle additional overhead of the toolbox.
  1596.  
  1597. --Kent
  1598.  
  1599. -- 
  1600. Kent Sandvik   sandvik@apple.com   New Media Analyst/Programmer
  1601. Private activities on Internet.
  1602.  
  1603. +++++++++++++++++++++++++++
  1604.  
  1605. >From aberno@genome.stanford.edu (Anthony Berno)
  1606. Date: Tue, 15 Nov 1994 09:06:13 -0800
  1607. Organization: Stanford DNA Sequence and Technology Center
  1608.  
  1609. In article <3a92u6$io8@cantua.canterbury.ac.nz>,
  1610. greg@cosc.canterbury.ac.nz (Greg Ewing) wrote:
  1611.  
  1612. > In article <aberno-1411940945140001@lyapunov.stanford.edu>,
  1613. aberno@genome.stanford.edu (Anthony Berno) writes:
  1614. > |> 
  1615. > |> ...Except, of course, this didn't work. The reason it didn't work cuts to
  1616. > |> the core of what I've been trying to say about the design of PowerPlant.
  1617. > What you're complaining about doesn't seem to me to be
  1618. > a fundamental flaw in the design of PowerPlant. It's
  1619. > just a reflection of the fact that the class you're
  1620. > using wasn't designed to do what you want.
  1621. > Whenever you want to extend a class to do something
  1622. > its author hadn't anticipated, you have to be prepared
  1623. > to understand some of its internals.
  1624.  
  1625. Just a sec here... all I wanted to do was to add an item to a popup menu!
  1626. Saying "the class wasn't designed for that" is like saying "This car
  1627. wasn't designed to have gas put into the tank" after it explodes at the
  1628. gas station.
  1629.  
  1630. -Anthony
  1631.  
  1632. +++++++++++++++++++++++++++
  1633.  
  1634. >From scott@kaiwan.kaiwan.com (Scott Ellsworth)
  1635. Date: 15 Nov 1994 09:24:00 -0800
  1636. Organization: KAIWAN Internet (310/527-4279,818/756-0180,714/638-4133)
  1637.  
  1638. One minor point - I was always taught to add methods to a class when 
  1639. modifying base behaviors.  Thus, whenever I need to fiddle with the 
  1640. underlying mac stuff, I wrap a member function around it and make sure 
  1641. that I fiddle with PowerPlant internals at the same time/place.
  1642.  
  1643. I realize that putting the modified behavior in a class wrapper does not 
  1644. magically cause it to understand the PP internals, and it would be really 
  1645. handy if one never needed to modify the internals, but I find that it 
  1646. works as a good reminder to me that I have to make sure I am not stomping 
  1647. on any behaviors.
  1648.  
  1649. Scott
  1650.  
  1651. -- 
  1652. Scott Ellsworth          scott@kaiwan.com
  1653. Missing mudders, put your email addrs in the directory!
  1654. "This is the aorta of the last person to ask me that" - Scott Adams
  1655.  
  1656. +++++++++++++++++++++++++++
  1657.  
  1658. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1659. Date: 15 Nov 1994 22:27:46 GMT
  1660. Organization: University of Canterbury, Christchurch, New Zealand
  1661.  
  1662.  
  1663. In article <sandvik-1411942230550001@mac62.kip.apple.com>, sandvik@apple.com (Kent Sandvik) writes:
  1664. |> And there was a reason these were
  1665. |> rewritten in hand-coded asm in the Mac incarnation.
  1666.  
  1667. But they could have written it in OO assembly language...
  1668.  
  1669. |> Kent Sandvik   sandvik@apple.com   New Media Analyst/Programmer
  1670.  
  1671. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1672. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  1673. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  1674. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  1675.  
  1676. +++++++++++++++++++++++++++
  1677.  
  1678. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1679. Date: 15 Nov 1994 22:34:18 GMT
  1680. Organization: University of Canterbury, Christchurch, New Zealand
  1681.  
  1682.  
  1683. In article <aberno-1511940906130001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  1684. |> Saying "the class wasn't designed for that" is like saying "This car
  1685. |> wasn't designed to have gas put into the tank" after it explodes at the
  1686. |> gas station.
  1687.  
  1688. You seemed to be saying "The author of PopUpMenu forgot to
  1689. include a method for adding items, so the basic, underlying
  1690. structure of PowerPlant is fundamentally and hopelessly
  1691. flawed!"
  1692.  
  1693. That's what I was arguing against.
  1694.  
  1695. |> -Anthony
  1696.  
  1697. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1698. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  1699. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  1700. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  1701.  
  1702. +++++++++++++++++++++++++++
  1703.  
  1704. >From Darryl Trujillo <dmt@pairoducks.com>
  1705. Date: Tue, 15 Nov 1994 21:55:42 GMT
  1706. Organization: Occidental Palace
  1707.  
  1708. In article <rondavis-1411941540000001@groomlake.datawatch.com> Ron Davis,
  1709. rondavis@datawatch.com writes:
  1710. >MacApp has its own special way of handling memory and segments.  PP
  1711. >doesn't screw around with the basic structure of a Mac program.  This
  1712. >memory thing is why it is so hard to get MacApp to work under
  1713. >CodeWarrior.  I understand the people from Symantec got PP running under
  1714. >thier system in a matter of hours, where as they never got MacApp to work
  1715. >with Think.
  1716.  
  1717. I think this had more to do with Think's lack of support for #pragma
  1718. segment than basic MacApp design.
  1719.  
  1720.         - dmt
  1721. +++++++++++++++++++++++++++
  1722.  
  1723. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1724. Date: Wed, 16 Nov 1994 22:55:24 +1300 (NZDT)
  1725. Organization: (none)
  1726.  
  1727. greg@cosc.canterbury.ac.nz (Greg Ewing) writes:
  1728. > In article <aberno-1511940906130001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  1729. > |> Saying "the class wasn't designed for that" is like saying "This car
  1730. > |> wasn't designed to have gas put into the tank" after it explodes at the
  1731. > |> gas station.
  1732. > You seemed to be saying "The author of PopUpMenu forgot to
  1733. > include a method for adding items, so the basic, underlying
  1734. > structure of PowerPlant is fundamentally and hopelessly
  1735. > flawed!"
  1736. > That's what I was arguing against.
  1737.  
  1738. If MWerks say "we're planning to add more functionality in CW6" then fine.
  1739.  
  1740. But they seem to be saying: "We're not going to add that functionailty.  Not
  1741. encapsulating the underlying toolbox capabilities is a design feature, not
  1742. an oversight."
  1743.  
  1744. If they're going to take that kind of approach (which I disagree with), and
  1745. make the programmer reach through and fondle toolbox structures by themselves
  1746. anyway, then they shouldn't be caching *any* data (such as the number of items
  1747. in the menu) in the PP object.  If it's oversight they are forgiven.  If it's
  1748. by design, it's wrong.
  1749.  
  1750. -- Bruce
  1751.  
  1752. +++++++++++++++++++++++++++
  1753.  
  1754. >From pgontier@novell.com (Pete Gontier)
  1755. Date: Wed, 16 Nov 1994 11:41:33 -0700
  1756. Organization: Novell, Inc., Walnut Creek /Macintosh Site
  1757.  
  1758. In article <aberno-1511940906130001@lyapunov.stanford.edu>, 
  1759. aberno@genome.stanford.edu (Anthony Berno) wrote:
  1760.  
  1761. > Just a sec here... all I wanted to do was to add an item to a popup menu!
  1762. > Saying "the class wasn't designed for that" is like saying "This car
  1763. > wasn't designed to have gas put into the tank" after it explodes at the
  1764. > gas station.
  1765.  
  1766. Nobody said the class wasn't broken. (Nobody said it was, either, but I am
  1767. assuming for the sake of discussion that your observations about it are
  1768. damning enough that most reasonable observers would consider it broken.)
  1769. However, your earlier post seemed to claim that since the popup menu class
  1770. is broken, PowerPlant is broken. That's a generalization fallacy. I'm not
  1771. exactly what I would call a PowerPlant fan, but bashing its overall design
  1772. because of the deficiencies of one class is wrong.
  1773.  
  1774. A much more constructive use of your energy would be to alter the popup
  1775. menu class to work the way you want it to and send your changes to
  1776. Metrowerks, through which they will be routed to Greg. He's a receptive
  1777. guy.
  1778.  
  1779. If all you want is a popup menu that works the way you want it, then
  1780. sub-classing is another option. I'd rather see sub-classing used to add
  1781. functionality than to correct deficiencies, though.
  1782.  
  1783. -- 
  1784.  
  1785.  Views expressed here do not necessarily reflect those of my employer.
  1786.  
  1787. +++++++++++++++++++++++++++
  1788.  
  1789. >From Mike Lockwood <lockwood@cambridge.apple.com>
  1790. Date: 17 Nov 1994 01:13:27 GMT
  1791. Organization: Apple Computer, Inc.
  1792.  
  1793. In article <1994Nov11.221337.1940@newsserver.rrzn.uni-hannover.de>
  1794. McCammond, McCammond@sgi.siemens.com writes:
  1795. >As far as forgetting the "monolithic" vs. "forest" argument, RR can't
  1796. >so easily dismiss what is a major evolutionary step forward in OO
  1797. >design. Contrary to what RR is saying, I would argue that PowerPlant's
  1798. >design philosophy will allow it to be used to create applications that
  1799. >solve even more complex problems more quickly and easily. It takes the
  1800. >best advantages of OO design and builds on them--namely encapsulation
  1801. >and separation of concerns. Let's just take one example: TView. In
  1802. >MacApp it handles drawing, mouse clicks, keyboard and menu events, idle
  1803. >task handling. I could probably think of a few more things thrown into
  1804. >TView, if I put my mind to it. Face it. MacApp is bloated.
  1805. >
  1806. >PowerPlant's design is simply simpler. Easier to grasp. More natural
  1807. >and cleaner once you do. Let's take the functionality in TView.
  1808. >PowerPlant has an LPane class whose only responsibility is drawing on
  1809. >the screen and accepting clicks. LCommander handles keyboard and menu
  1810. >events. LPeriodical handles idle tasks. How is this used? Let's take an
  1811. >edit text, it is drawn on the screen, so it inherits from LPane. It
  1812. >handles keyboard events, so it inherits from LCommander. It
  1813. >periodically blinks the insertion point, so it inherits from
  1814. >LPeriodical. Each of these classes can be understood and used
  1815. >separately--or not used at all if its not appropriate. This leads to
  1816. >more cleanly separating functionality as well as having finer grained
  1817. >classes with fewer dependencies--a structure which is easier to learn
  1818. >and simpler to maintain.
  1819.  
  1820. I haven't had a chance to try Power Plant yet, so I can't make any
  1821. recommendations about Power Plant vs. MacApp.  But I was wondering...
  1822.  
  1823. If you want to have a view that can draw, handle mouse clicks, respond to
  1824. menu events and Apple events, do things at idle time (blink the cursor or
  1825. animate a selection with marching ants), etc.  it sounds like you have to
  1826. subclass from LPane, LCommander, LPeriodical and possibly some other
  1827. classes.  How well has this been working out for people?  I haven't used
  1828. MI in C++, but have heard that C++ MI has a lot of gotchas that you have
  1829. to be aware of.  Is this ever a problem, or am I nervous about this for
  1830. no good reason?
  1831.  
  1832. I thought about doing something like this in the Dylan framework, but
  1833. decided to do make the view system more like MacApp's view system.  I
  1834. wanted all views to have the ability to handle events, so you can add
  1835. behaviors to any view.  Providing the ability to add a behavior to any
  1836. view is critical for supporting an interface builder that can do live
  1837. editing of views in your running program.  I'm not sure how this could be
  1838. implemented in a view system that has views with no event handling
  1839. capabilities, but I suppose you could find a way to do it.
  1840. - ---------------------------------------------------------------------
  1841. Mike Lockwood                              lockwood@cambridge.apple.com
  1842. Full Time Dylan Hacker/Part Time CodeWarrior Hacker
  1843. Apple Computer, Inc.       "still cannot fix this broken machine" - NIN
  1844.  
  1845. +++++++++++++++++++++++++++
  1846.  
  1847. >From scouten@uiuc.edu (Eric Scouten)
  1848. Date: Thu, 17 Nov 1994 19:38:20 -0600
  1849. Organization: University of Illinois
  1850.  
  1851. In article <3aeann$kat@services.cambridge.apple.com>, Mike Lockwood
  1852. <lockwood@cambridge.apple.com> wrote:
  1853.  
  1854. > If you want to have a view that can draw, handle mouse clicks, respond to
  1855. > menu events and Apple events, do things at idle time (blink the cursor or
  1856. > animate a selection with marching ants), etc.  it sounds like you have to
  1857. > subclass from LPane, LCommander, LPeriodical and possibly some other
  1858. > classes.
  1859.  
  1860. Exactly.
  1861.  
  1862. > How well has this been working out for people?
  1863.  
  1864. Quite well in my mind.
  1865.  
  1866.  
  1867. > I haven't used
  1868. > MI in C++, but have heard that C++ MI has a lot of gotchas that you have
  1869. > to be aware of.  Is this ever a problem, or am I nervous about this for
  1870. > no good reason?
  1871.  
  1872. I think that the main problem with MI in C++ is that it's intimidating to
  1873. the new C++ programmer. (And I'm not intending to insult anybody with that
  1874. statement.) It is difficult to explain to somebody that a particular
  1875. object is both a LPane, LPeriodical, and an LEditField (or whatever).
  1876.  
  1877. But once you wrap your mind around it, it's a very flexible and powerful
  1878. mechanism. Here's one reason I like it. In one (hypothetical) application
  1879. I'm designing, I may need to display static information, but not respond
  1880. to any mouse down events in the window's content areas. Then I can totally
  1881. dismiss the LCommander hierarchy from the drawing routines; this makes
  1882. them simpler and smaller.
  1883.  
  1884. In the next application, I may need all kinds of controls and editable
  1885. fields and whatnot. Then I can drag in those methods (which are neatly
  1886. grouped in the LCommander base class).
  1887.  
  1888. So what I'm saying, in a long-winded way, is that I see no reason to shy
  1889. away from multiple inheritance.
  1890.  
  1891. -es
  1892.  
  1893. __________________________________________________________________________
  1894. Eric Scouten <scouten@uiuc.edu> * MS Comp Sci '96, Univ of Illinois
  1895.  
  1896. This message printed on 100% recycled electrons.
  1897.  
  1898. +++++++++++++++++++++++++++
  1899.  
  1900. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1901. Date: 15 Nov 1994 22:34:18 GMT
  1902. Organization: University of Canterbury, Christchurch, New Zealand
  1903.  
  1904.  
  1905. In article <aberno-1511940906130001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  1906. |> Saying "the class wasn't designed for that" is like saying "This car
  1907. |> wasn't designed to have gas put into the tank" after it explodes at the
  1908. |> gas station.
  1909.  
  1910. You seemed to be saying "The author of PopUpMenu forgot to
  1911. include a method for adding items, so the basic, underlying
  1912. structure of PowerPlant is fundamentally and hopelessly
  1913. flawed!"
  1914.  
  1915. That's what I was arguing against.
  1916.  
  1917. |> -Anthony
  1918.  
  1919. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1920. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  1921. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  1922. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  1923.  
  1924. +++++++++++++++++++++++++++
  1925.  
  1926. >From Darryl Trujillo <dmt@pairoducks.com>
  1927. Date: Tue, 15 Nov 1994 21:55:42 GMT
  1928. Organization: Occidental Palace
  1929.  
  1930. In article <rondavis-1411941540000001@groomlake.datawatch.com> Ron Davis,
  1931. rondavis@datawatch.com writes:
  1932. >MacApp has its own special way of handling memory and segments.  PP
  1933. >doesn't screw around with the basic structure of a Mac program.  This
  1934. >memory thing is why it is so hard to get MacApp to work under
  1935. >CodeWarrior.  I understand the people from Symantec got PP running under
  1936. >thier system in a matter of hours, where as they never got MacApp to work
  1937. >with Think.
  1938.  
  1939. I think this had more to do with Think's lack of support for #pragma
  1940. segment than basic MacApp design.
  1941.  
  1942.         - dmt
  1943.  
  1944. +++++++++++++++++++++++++++
  1945.  
  1946. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1947. Date: Wed, 16 Nov 1994 22:55:24 +1300 (NZDT)
  1948. Organization: (none)
  1949.  
  1950. greg@cosc.canterbury.ac.nz (Greg Ewing) writes:
  1951. > In article <aberno-1511940906130001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  1952. > |> Saying "the class wasn't designed for that" is like saying "This car
  1953. > |> wasn't designed to have gas put into the tank" after it explodes at the
  1954. > |> gas station.
  1955. > You seemed to be saying "The author of PopUpMenu forgot to
  1956. > include a method for adding items, so the basic, underlying
  1957. > structure of PowerPlant is fundamentally and hopelessly
  1958. > flawed!"
  1959. > That's what I was arguing against.
  1960.  
  1961. If MWerks say "we're planning to add more functionality in CW6" then fine.
  1962.  
  1963. But they seem to be saying: "We're not going to add that functionailty.  Not
  1964. encapsulating the underlying toolbox capabilities is a design feature, not
  1965. an oversight."
  1966.  
  1967. If they're going to take that kind of approach (which I disagree with), and
  1968. make the programmer reach through and fondle toolbox structures by themselves
  1969. anyway, then they shouldn't be caching *any* data (such as the number of items
  1970. in the menu) in the PP object.  If it's oversight they are forgiven.  If it's
  1971. by design, it's wrong.
  1972.  
  1973. -- Bruce
  1974.  
  1975. +++++++++++++++++++++++++++
  1976.  
  1977. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1978. Date: 15 Nov 1994 22:34:18 GMT
  1979. Organization: University of Canterbury, Christchurch, New Zealand
  1980.  
  1981.  
  1982. In article <aberno-1511940906130001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  1983. |> Saying "the class wasn't designed for that" is like saying "This car
  1984. |> wasn't designed to have gas put into the tank" after it explodes at the
  1985. |> gas station.
  1986.  
  1987. You seemed to be saying "The author of PopUpMenu forgot to
  1988. include a method for adding items, so the basic, underlying
  1989. structure of PowerPlant is fundamentally and hopelessly
  1990. flawed!"
  1991.  
  1992. That's what I was arguing against.
  1993.  
  1994. |> -Anthony
  1995.  
  1996. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1997. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  1998. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  1999. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  2000.  
  2001. +++++++++++++++++++++++++++
  2002.  
  2003. >From Darryl Trujillo <dmt@pairoducks.com>
  2004. Date: Tue, 15 Nov 1994 21:55:42 GMT
  2005. Organization: Occidental Palace
  2006.  
  2007. In article <rondavis-1411941540000001@groomlake.datawatch.com> Ron Davis,
  2008. rondavis@datawatch.com writes:
  2009. >MacApp has its own special way of handling memory and segments.  PP
  2010. >doesn't screw around with the basic structure of a Mac program.  This
  2011. >memory thing is why it is so hard to get MacApp to work under
  2012. >CodeWarrior.  I understand the people from Symantec got PP running under
  2013. >thier system in a matter of hours, where as they never got MacApp to work
  2014. >with Think.
  2015.  
  2016. I think this had more to do with Think's lack of support for #pragma
  2017. segment than basic MacApp design.
  2018.  
  2019.         - dmt
  2020.  
  2021. +++++++++++++++++++++++++++
  2022.  
  2023. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  2024. Date: Wed, 16 Nov 1994 22:55:24 +1300 (NZDT)
  2025. Organization: (none)
  2026.  
  2027. greg@cosc.canterbury.ac.nz (Greg Ewing) writes:
  2028. > In article <aberno-1511940906130001@lyapunov.stanford.edu>, aberno@genome.stanford.edu (Anthony Berno) writes:
  2029. > |> Saying "the class wasn't designed for that" is like saying "This car
  2030. > |> wasn't designed to have gas put into the tank" after it explodes at the
  2031. > |> gas station.
  2032. > You seemed to be saying "The author of PopUpMenu forgot to
  2033. > include a method for adding items, so the basic, underlying
  2034. > structure of PowerPlant is fundamentally and hopelessly
  2035. > flawed!"
  2036. > That's what I was arguing against.
  2037.  
  2038. If MWerks say "we're planning to add more functionality in CW6" then fine.
  2039.  
  2040. But they seem to be saying: "We're not going to add that functionailty.  Not
  2041. encapsulating the underlying toolbox capabilities is a design feature, not
  2042. an oversight."
  2043.  
  2044. If they're going to take that kind of approach (which I disagree with), and
  2045. make the programmer reach through and fondle toolbox structures by themselves
  2046. anyway, then they shouldn't be caching *any* data (such as the number of items
  2047. in the menu) in the PP object.  If it's oversight they are forgiven.  If it's
  2048. by design, it's wrong.
  2049.  
  2050. -- Bruce
  2051.  
  2052. +++++++++++++++++++++++++++
  2053.  
  2054. >From pgontier@novell.com (Pete Gontier)
  2055. Date: Wed, 16 Nov 1994 11:41:33 -0700
  2056. Organization: Novell, Inc., Walnut Creek /Macintosh Site
  2057.  
  2058. In article <aberno-1511940906130001@lyapunov.stanford.edu>, 
  2059. aberno@genome.stanford.edu (Anthony Berno) wrote:
  2060.  
  2061. > Just a sec here... all I wanted to do was to add an item to a popup menu!
  2062. > Saying "the class wasn't designed for that" is like saying "This car
  2063. > wasn't designed to have gas put into the tank" after it explodes at the
  2064. > gas station.
  2065.  
  2066. Nobody said the class wasn't broken. (Nobody said it was, either, but I am
  2067. assuming for the sake of discussion that your observations about it are
  2068. damning enough that most reasonable observers would consider it broken.)
  2069. However, your earlier post seemed to claim that since the popup menu class
  2070. is broken, PowerPlant is broken. That's a generalization fallacy. I'm not
  2071. exactly what I would call a PowerPlant fan, but bashing its overall design
  2072. because of the deficiencies of one class is wrong.
  2073.  
  2074. A much more constructive use of your energy would be to alter the popup
  2075. menu class to work the way you want it to and send your changes to
  2076. Metrowerks, through which they will be routed to Greg. He's a receptive
  2077. guy.
  2078.  
  2079. If all you want is a popup menu that works the way you want it, then
  2080. sub-classing is another option. I'd rather see sub-classing used to add
  2081. functionality than to correct deficiencies, though.
  2082.  
  2083. -- 
  2084.  
  2085.  Views expressed here do not necessarily reflect those of my employer.
  2086.  
  2087. +++++++++++++++++++++++++++
  2088.  
  2089. >From Mike Lockwood <lockwood@cambridge.apple.com>
  2090. Date: 17 Nov 1994 01:13:27 GMT
  2091. Organization: Apple Computer, Inc.
  2092.  
  2093. In article <1994Nov11.221337.1940@newsserver.rrzn.uni-hannover.de>
  2094. McCammond, McCammond@sgi.siemens.com writes:
  2095. >As far as forgetting the "monolithic" vs. "forest" argument, RR can't
  2096. >so easily dismiss what is a major evolutionary step forward in OO
  2097. >design. Contrary to what RR is saying, I would argue that PowerPlant's
  2098. >design philosophy will allow it to be used to create applications that
  2099. >solve even more complex problems more quickly and easily. It takes the
  2100. >best advantages of OO design and builds on them--namely encapsulation
  2101. >and separation of concerns. Let's just take one example: TView. In
  2102. >MacApp it handles drawing, mouse clicks, keyboard and menu events, idle
  2103. >task handling. I could probably think of a few more things thrown into
  2104. >TView, if I put my mind to it. Face it. MacApp is bloated.
  2105. >
  2106. >PowerPlant's design is simply simpler. Easier to grasp. More natural
  2107. >and cleaner once you do. Let's take the functionality in TView.
  2108. >PowerPlant has an LPane class whose only responsibility is drawing on
  2109. >the screen and accepting clicks. LCommander handles keyboard and menu
  2110. >events. LPeriodical handles idle tasks. How is this used? Let's take an
  2111. >edit text, it is drawn on the screen, so it inherits from LPane. It
  2112. >handles keyboard events, so it inherits from LCommander. It
  2113. >periodically blinks the insertion point, so it inherits from
  2114. >LPeriodical. Each of these classes can be understood and used
  2115. >separately--or not used at all if its not appropriate. This leads to
  2116. >more cleanly separating functionality as well as having finer grained
  2117. >classes with fewer dependencies--a structure which is easier to learn
  2118. >and simpler to maintain.
  2119.  
  2120. I haven't had a chance to try Power Plant yet, so I can't make any
  2121. recommendations about Power Plant vs. MacApp.  But I was wondering...
  2122.  
  2123. If you want to have a view that can draw, handle mouse clicks, respond to
  2124. menu events and Apple events, do things at idle time (blink the cursor or
  2125. animate a selection with marching ants), etc.  it sounds like you have to
  2126. subclass from LPane, LCommander, LPeriodical and possibly some other
  2127. classes.  How well has this been working out for people?  I haven't used
  2128. MI in C++, but have heard that C++ MI has a lot of gotchas that you have
  2129. to be aware of.  Is this ever a problem, or am I nervous about this for
  2130. no good reason?
  2131.  
  2132. I thought about doing something like this in the Dylan framework, but
  2133. decided to do make the view system more like MacApp's view system.  I
  2134. wanted all views to have the ability to handle events, so you can add
  2135. behaviors to any view.  Providing the ability to add a behavior to any
  2136. view is critical for supporting an interface builder that can do live
  2137. editing of views in your running program.  I'm not sure how this could be
  2138. implemented in a view system that has views with no event handling
  2139. capabilities, but I suppose you could find a way to do it.
  2140. - ---------------------------------------------------------------------
  2141. Mike Lockwood                              lockwood@cambridge.apple.com
  2142. Full Time Dylan Hacker/Part Time CodeWarrior Hacker
  2143. Apple Computer, Inc.       "still cannot fix this broken machine" - NIN
  2144.  
  2145. +++++++++++++++++++++++++++
  2146.  
  2147. >From scouten@uiuc.edu (Eric Scouten)
  2148. Date: Thu, 17 Nov 1994 19:38:20 -0600
  2149. Organization: University of Illinois
  2150.  
  2151. In article <3aeann$kat@services.cambridge.apple.com>, Mike Lockwood
  2152. <lockwood@cambridge.apple.com> wrote:
  2153.  
  2154. > If you want to have a view that can draw, handle mouse clicks, respond to
  2155. > menu events and Apple events, do things at idle time (blink the cursor or
  2156. > animate a selection with marching ants), etc.  it sounds like you have to
  2157. > subclass from LPane, LCommander, LPeriodical and possibly some other
  2158. > classes.
  2159.  
  2160. Exactly.
  2161.  
  2162. > How well has this been working out for people?
  2163.  
  2164. Quite well in my mind.
  2165.  
  2166.  
  2167. > I haven't used
  2168. > MI in C++, but have heard that C++ MI has a lot of gotchas that you have
  2169. > to be aware of.  Is this ever a problem, or am I nervous about this for
  2170. > no good reason?
  2171.  
  2172. I think that the main problem with MI in C++ is that it's intimidating to
  2173. the new C++ programmer. (And I'm not intending to insult anybody with that
  2174. statement.) It is difficult to explain to somebody that a particular
  2175. object is both a LPane, LPeriodical, and an LEditField (or whatever).
  2176.  
  2177. But once you wrap your mind around it, it's a very flexible and powerful
  2178. mechanism. Here's one reason I like it. In one (hypothetical) application
  2179. I'm designing, I may need to display static information, but not respond
  2180. to any mouse down events in the window's content areas. Then I can totally
  2181. dismiss the LCommander hierarchy from the drawing routines; this makes
  2182. them simpler and smaller.
  2183.  
  2184. In the next application, I may need all kinds of controls and editable
  2185. fields and whatnot. Then I can drag in those methods (which are neatly
  2186. grouped in the LCommander base class).
  2187.  
  2188. So what I'm saying, in a long-winded way, is that I see no reason to shy
  2189. away from multiple inheritance.
  2190.  
  2191. -es
  2192.  
  2193. __________________________________________________________________________
  2194. Eric Scouten <scouten@uiuc.edu> * MS Comp Sci '96, Univ of Illinois
  2195.  
  2196. This message printed on 100% recycled electrons.
  2197.  
  2198. +++++++++++++++++++++++++++
  2199.  
  2200. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  2201. Date: Sat, 19 Nov 1994 12:27:18 +1300 (NZDT)
  2202. Organization: (none)
  2203.  
  2204. Mike Lockwood <lockwood@cambridge.apple.com> writes:
  2205. > I thought about doing something like this in the Dylan framework, but
  2206. > decided to do make the view system more like MacApp's view system.  I
  2207. > wanted all views to have the ability to handle events, so you can add
  2208. > behaviors to any view.  Providing the ability to add a behavior to any
  2209. > view is critical for supporting an interface builder that can do live
  2210. > editing of views in your running program.  I'm not sure how this could be
  2211. > implemented in a view system that has views with no event handling
  2212. > capabilities, but I suppose you could find a way to do it.
  2213.  
  2214. Behaviours certainly proved to be very useful in MacApp 3 and one of the most
  2215. important differences between MacApp 3 and MacApp2&TCL.  There are a lot of
  2216. situations where it's impossible to alter behaviour of some MacApp-internal
  2217. class because even if you subclass it you can't get access to the point
  2218. where it is *created* unless you reimplement a lot of other code, or alter
  2219. the source of MacApp.
  2220.  
  2221. It's possible, I guess, that this just indicates bad design within MacApp,
  2222. but I'm more inclined to think that the original designer simply can't
  2223. ever anticipate all possible future needs and split off a virtual function
  2224. for each one -- at some point you've got to provide a general method to
  2225. attach extra stuff to existing objects.
  2226.  
  2227. The minor downside of behaviours is a small performance penalty searching
  2228. sequentially through all the behaviours compared to virtual function dispatch.
  2229.  
  2230. The major downside is that there are no language facilities to ensure that
  2231. behaviours are checked for in every instance, and given a chance to act.
  2232. Thus the HandleEvent/DoEvent, HandleKeyDown/DoKeyDown etc dichotomy, where
  2233. HandleXXX checks for behaviours and passes the event to them if they exist,
  2234. or calls DoXXX otherwise.
  2235.  
  2236. This is a major source of potential errors, and would be better avoided.
  2237. But as far as I can see, Dylan works in exactly the same way as C++ in
  2238. this regard.
  2239.  
  2240. -- Bruce
  2241.  
  2242. +++++++++++++++++++++++++++
  2243.  
  2244. >From sandvik@apple.com (Kent Sandvik)
  2245. Date: Fri, 25 Nov 1994 14:59:13 -0800
  2246. Organization: Apple Computer, Inc. Developer Technical Support
  2247.  
  2248. In article <3aeann$kat@services.cambridge.apple.com>, Mike Lockwood
  2249. <lockwood@cambridge.apple.com> wrote:
  2250. > If you want to have a view that can draw, handle mouse clicks, respond to
  2251. > menu events and Apple events, do things at idle time (blink the cursor or
  2252. > animate a selection with marching ants), etc.  it sounds like you have to
  2253. > subclass from LPane, LCommander, LPeriodical and possibly some other
  2254. > classes.  How well has this been working out for people?  I haven't used
  2255. > MI in C++, but have heard that C++ MI has a lot of gotchas that you have
  2256. > to be aware of.  Is this ever a problem, or am I nervous about this for
  2257. > no good reason?
  2258.  
  2259. Ouch, my C++ arcana knowledge is pretty rusty, but what I remembered the
  2260. ordering of MI in C++ was not fully defined until the wonderful world of
  2261. C++ re-introduced a yet-another-definition of virtual, so defining virtual
  2262. in front of the mixin classes defines the ordering.
  2263.  
  2264. We still have the name clash issue that seems to drag on concerning a
  2265. standard; in other words if there are member functions with the same name
  2266. mixed in, let's say Initialize(), then it's really a compiler decision
  2267. which one to select from the possible ones mixed in. 
  2268.  
  2269. Otherwise MI is sort of fun, but it has it's funny moments. It will
  2270. certainly minimize code used in various places. Then again if we have most
  2271. of the framework inside a shared library, maybe that's not an issue unless
  2272. the notion of delegation and data separation are big ones in the design of
  2273. the framework.
  2274.  
  2275. Cheers, Kent
  2276.  
  2277. -- 
  2278. Kent Sandvik   sandvik@apple.com   New Media Analyst/Programmer
  2279. Private activities on Internet.
  2280.  
  2281. +++++++++++++++++++++++++++
  2282.  
  2283. >From Lars.Farm@nts.mh.se (Lars Farm)
  2284. Date: Sat, 26 Nov 1994 13:39:03 +0100
  2285. Organization: Mid Sweden University
  2286.  
  2287. In article <sandvik-2511941459130001@17.255.38.246>, sandvik@apple.com
  2288. (Kent Sandvik) wrote:
  2289.  
  2290. > We still have the name clash issue that seems to drag on concerning a
  2291. > standard; in other words if there are member functions with the same name
  2292. > mixed in, let's say Initialize(), then it's really a compiler decision
  2293. > which one to select from the possible ones mixed in. 
  2294.  
  2295. With virtual bases, dominance comes in to play but all ambiguities must be
  2296. resolved by the user. As far as I know there is no undefined behavior.
  2297.  
  2298. > Then again if we have most
  2299. > of the framework inside a shared library, maybe that's not an issue [...]
  2300.  
  2301. Code size is important, but other qualities are much more important:
  2302.  
  2303. Coupling: High coupling (like in MA/TCL) means that you must learn,
  2304. understand and use the whole framework to use some small part. Weak
  2305. coupling (PP at least compared to MA/TCL) means you only need to learn the
  2306. thing that you want to reuse and can ignore the rest of the framework. It
  2307. can also be reused without having to drag in the rest of the framework.
  2308.  
  2309. Cohesion: A class that has one and only one area of responsibility (PP) is
  2310. easy to learn, explain, understand and therefor easy to reuse, a class
  2311. that does it all plus a bit of this and a bit of that (MA/TCL) is hard to
  2312. learn, explain, understand and therefor hard to reuse. It is not cohesive.
  2313.  
  2314. A class or _small_ module of classes that can be reused and understood on
  2315. it's own is much preferred over a class or module that can only be reused
  2316. and understood in the context of the whole framework.
  2317.  
  2318. IMHO these quality measures are extremely important and the very reason
  2319. that PP feels cleaner than MA/TCL. Aim for high cohesion and low coupling.
  2320. This precludes the tree aproach and leads to a forrest of small trees
  2321. independant of each other or anything else. Code bloat is nothing compared
  2322. to this even though bloated code is bad in it self.
  2323.  
  2324. [...] unless
  2325. > the notion of delegation and data separation are big ones in the design of
  2326. > the framework.
  2327.  
  2328. Lars
  2329.  
  2330. -- 
  2331. Lars.Farm@nts.mh.se
  2332.  
  2333. +++++++++++++++++++++++++++
  2334.  
  2335. >From ersmith@ucsd.edu (Erik Smith)
  2336. Date: Tue, 29 Nov 1994 12:01:08 -0800
  2337. Organization: IR/PS
  2338.  
  2339. Greg does not want to isolate programmers from the toolbox.  I appreciate
  2340. the way this makes powerplant smaller and simpler.  On the other hand, I
  2341. find that I am subclassing almost everything and adding my own accessors
  2342. and mutators that isolate my higher level code from the toolbox.  This
  2343. isn't really a lot of work so I'm not complaining.  I like working with
  2344. the toolbox at the same time.
  2345.  
  2346. What if there was another layer of subclasses provided with powerplant
  2347. that provided a friendlier API and isolated the toolbox?  Programmers
  2348. could then choose to exclude those classes when they didn't want the extra
  2349. bulk.  I don't want to see a method for every call in quickdraw for LPane,
  2350. but some basic additions to LListBox,LPopup, and other classes would be
  2351. nice.
  2352.  
  2353. -Erik
  2354.  
  2355. +++++++++++++++++++++++++++
  2356.  
  2357. >From sandvik@apple.com (Kent Sandvik)
  2358. Date: Sun, 04 Dec 1994 18:13:04 -0800
  2359. Organization: Apple Computer, Inc. Developer Technical Support
  2360.  
  2361. In article <Lars.Farm-2611941339030001@sleipner.nts.mh.se>,
  2362. Lars.Farm@nts.mh.se (Lars Farm) wrote:
  2363.  
  2364. > In article <sandvik-2511941459130001@17.255.38.246>, sandvik@apple.com
  2365. > (Kent Sandvik) wrote:
  2366. > > We still have the name clash issue that seems to drag on concerning a
  2367. > > standard; in other words if there are member functions with the same name
  2368. > > mixed in, let's say Initialize(), then it's really a compiler decision
  2369. > > which one to select from the possible ones mixed in. 
  2370. > With virtual bases, dominance comes in to play but all ambiguities must be
  2371. > resolved by the user. As far as I know there is no undefined behavior.
  2372.  
  2373. As I remember virtual base classes defines the ordering of mixing
  2374. constructors. But it does not eliminate the problem if the mixin classes
  2375. each has a member function called Initialize(void), and the code called
  2376. uses this->Initialize(). Maybe this is resolved with RTTI, it's been ages
  2377. since I last hacked C++ inside out.
  2378.  
  2379. --Kent
  2380.  
  2381. -- 
  2382. Kent Sandvik   sandvik@apple.com   New Media Analyst/Programmer
  2383. Private activities on Internet.
  2384.  
  2385. +++++++++++++++++++++++++++
  2386.  
  2387. >From Lars.Farm@nts.mh.se (Lars Farm)
  2388. Date: Thu, 08 Dec 1994 13:41:40 +0100
  2389. Organization: Mid Sweden University
  2390.  
  2391. In article <sandvik-0412941813040001@17.255.38.234>, sandvik@apple.com
  2392. (Kent Sandvik) wrote:
  2393.  
  2394. > > > We still have the name clash issue that seems to drag on concerning a
  2395. > > > standard; in other words if there are member functions with the same name
  2396. > > > mixed in, let's say Initialize(), then it's really a compiler decision
  2397. > > > which one to select from the possible ones mixed in. 
  2398. > > 
  2399. > > With virtual bases, dominance comes in to play but all ambiguities must
  2400. > > be resolved by the user. As far as I know there is no undefined behavior.
  2401. >
  2402. > As I remember virtual base classes defines the ordering of mixing
  2403. > constructors. But it does not eliminate the problem if the mixin classes
  2404. > each has a member function called Initialize(void), and the code called
  2405. > uses this->Initialize(). Maybe this is resolved with RTTI, it's been ages
  2406. > since I last hacked C++ inside out.
  2407.  
  2408. This has nothing to do with rtti. Rtti is about asking an object about
  2409. it's type and about checked safe down casts.
  2410.  
  2411. Long answer : see ARM 10.1.1, p 202 -- Ambiguities.
  2412. Short answer: Access to base class members must be unambiguous.
  2413.  
  2414. Your example:  class base1 { public: void Initialize(); };
  2415.                class base2 { public: void Initialize(); };
  2416.                class derived : public base1, public base2 {};
  2417.  
  2418.                void g( derived *d )
  2419.                {
  2420.                   d->Initialize();        // error: ambiguous
  2421.                   d->base1::Initialize(); // ok
  2422.                   d->base2::Initialize(); // ok
  2423.                }
  2424.  
  2425. Virtual bases have a name resolution scheme - dominance - that can resolve
  2426. some name clashes in a well defined and predictable way. Sort of 'virtual'
  2427. names. 
  2428.  
  2429. Lars
  2430.  
  2431. -- 
  2432. Lars.Farm@nts.mh.se
  2433.  
  2434. ---------------------------
  2435.  
  2436. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  2437. Subject: QuickDraw GX Thread Safe?
  2438. Date: Tue, 06 Dec 1994 11:52:23 -0600
  2439. Organization: Univ of Wisc-Madison Dept of Biochemistry
  2440.  
  2441. I thought that I remember reading somewhere that QuickDraw GX is
  2442. completely reentrant.  I was hoping then, that it would be possible to
  2443. make GX calls in preemptive threads.  Unfortunately, this appears not to
  2444. be the case as GXDrawShape() will start to come up, but eventually dies in
  2445. a preemptive thread.
  2446.  
  2447. Does anyone know anything about this?  How about GX calls at interrupt time?
  2448.  
  2449. Thanks,
  2450. Ken Prehoda
  2451. Department of Biochemistry
  2452. University of Wisconsin-Madison
  2453.  
  2454. +++++++++++++++++++++++++++
  2455.  
  2456. >From h+@metrowerks.com (Jon W{tte)
  2457. Date: Wed, 07 Dec 1994 16:55:29 +0100
  2458. Organization: The Conspiracy
  2459.  
  2460. In article <kenp-0612941152230001@f180-035.net.wisc.edu>,
  2461. kenp@nmrfam.wisc.edu (Ken Prehoda) wrote:
  2462.  
  2463. >I thought that I remember reading somewhere that QuickDraw GX is
  2464. >completely reentrant.  I was hoping then, that it would be possible to
  2465. >make GX calls in preemptive threads.  Unfortunately, this appears not to
  2466. >be the case as GXDrawShape() will start to come up, but eventually dies in
  2467. >a preemptive thread.
  2468.  
  2469. GX is re-entrant. That's probably one of the reasons they have 
  2470. their own memory manager pool.
  2471.  
  2472. However, there are more things to calling stuff at interrupt 
  2473. time than being re-entrant:
  2474.  
  2475. Lower-priority interrupts don't happen. This may include things 
  2476. like Ticks being updated; I/O completing etc.
  2477.  
  2478. You can't cause the VM system to work, because that would make 
  2479. the interrupt handler take too long, and requires I/O which in 
  2480. turn is dependent on the interrupt system. Not to mention that 
  2481. you may have been interrupted while I/O was going on.
  2482.  
  2483. You can't interface with the rest of the toolbox, because 
  2484. that's not re-entrant. GXDrawShape does interface with the rest 
  2485. of the toolbox, because it draws into a WindowPtr somewhere 
  2486. deep down.
  2487.  
  2488. Cheers,
  2489.  
  2490.                                 / h+
  2491.  
  2492.  
  2493. --
  2494.   Jon Wdtte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  2495.  
  2496.  Please prove me wrong. I'd rather learn something new than say something old.
  2497.  
  2498.  
  2499. ---------------------------
  2500.  
  2501. >From osiris@cs.utexas.edu (Rob Browning)
  2502. Subject: [Q] Need help with SetGWorld.
  2503. Date: Wed, 07 Dec 1994 03:03:03 -0600
  2504. Organization: The University of Texas at Austin
  2505.  
  2506. I got the impression from NIM:Imaging that you are supposed to use
  2507. SetGWorld and GetGWorld instead of SetPort and GetPort for all graphics
  2508. context switches when you are using color quickdraw (p. 2-18 (among other
  2509. places)).
  2510.  
  2511. Now my question is, if I create a window or CGrafPort, and I then want to
  2512. make it the current port, how do I know what to pass SetGWorld in the
  2513. device parameter?   In other words, if I have a pointer to a window that I
  2514. want to make the current port, how do I know what it's device is?
  2515.  
  2516. I saw some sample code that did something like this:
  2517.  
  2518. SetGWorld(myWin,GetMainDevice());
  2519.  
  2520. Will this always work?  Am I guaranteed that every onscreen window's
  2521. associated device is the main device?
  2522.  
  2523. Thanks,
  2524.  
  2525. --Rob.
  2526.  
  2527. +++++++++++++++++++++++++++
  2528.  
  2529. >From Paul Pharr <aabuva@wam.umd.edu>
  2530. Date: 7 Dec 1994 20:06:51 GMT
  2531. Organization: none
  2532.  
  2533. In article <osiris-0712940303030001@slip-8-15.ots.utexas.edu> Rob
  2534. Browning, osiris@cs.utexas.edu writes:
  2535. >Now my question is, if I create a window or CGrafPort, and I then want to
  2536. >make it the current port, how do I know what to pass SetGWorld in the
  2537. >device parameter?   In other words, if I have a pointer to a window that
  2538. I
  2539. >want to make the current port, how do I know what it's device is?
  2540. >
  2541.  
  2542. GetPort & SetPort work fine if the PixMaps of both the old & new port
  2543. are actually on screen. The only time they have problems is if the port
  2544. needs to be switched between a port on a screen and a port which is an
  2545. offscreen bitmap (i.e. GWorld) or vice-versa.
  2546.  
  2547. For example, if the current port is an offscreen GWorld which was set
  2548. with SetGWorld, then the current GDevice is the device associated with
  2549. that GWorld. If you then used SetPort to change the port to a window on
  2550. screen, the GrafPort would be changed to the one on screen, but the
  2551. GDevice would still be the one associated with your offscreen GWorld.
  2552. Drawing under these conditions causes terrible crashes!
  2553.  
  2554.  
  2555.  
  2556. The rule of thumb is:
  2557.  
  2558. *If you need to set the port to a GWorld you have created, use SetGWorld.
  2559.  
  2560. *If it is possible that the current port is a GWorld and you need to
  2561. save it and set a new port, then you must use GetGWorld/SetGWorld
  2562. rather than GetPort/SetPort.
  2563.  
  2564. In your case, unless you are switching to or from an offscreen GWorld,
  2565. then you need not call GetGWorld/SetGWorld. GetPort/SetPort will work
  2566. fine in any version of color QuickDraw.
  2567.  
  2568.  
  2569. >I saw some sample code that did something like this:
  2570. >
  2571. >SetGWorld(myWin,GetMainDevice());
  2572. >
  2573. >Will this always work?  Am I guaranteed that every onscreen window's
  2574. >associated device is the main device?
  2575.  
  2576.  
  2577. When QuickDraw draws, part of its job in supporting multiple screens is
  2578. setting the graphics device as appropriate for drawing operations on
  2579. each screen. As long as you pass a screen device when setting the
  2580. GWorld, QuickDraw will make sure it is set correctly if the window
  2581. spans multiple screens or is on a different screen altogether.
  2582.  
  2583. The short answer is Yes, it will work in all cases.
  2584.  
  2585. Paul C. Pharr
  2586. SW Engineer
  2587.  
  2588. +++++++++++++++++++++++++++
  2589.  
  2590. >From giles@med.cornell.edu (Aaron Giles)
  2591. Date: Wed, 07 Dec 1994 11:40:52 -0500
  2592. Organization: Cornell University Medical College
  2593.  
  2594. In article <osiris-0712940303030001@slip-8-15.ots.utexas.edu>,
  2595. osiris@cs.utexas.edu (Rob Browning) wrote:
  2596.  
  2597. > Now my question is, if I create a window or CGrafPort, and I then want to
  2598. > make it the current port, how do I know what to pass SetGWorld in the
  2599. > device parameter?
  2600.  
  2601. Just pass it a nil value, and the OS will figure it out for you.  That
  2602. goes for GWorlds, too.  In fact, the only time I ever use something other
  2603. than nil for the device parameter is when I'm saving and restoring the
  2604. port by using GetGWorld/SetGWorld, in which case I just pass the device
  2605. that GetGWorld gave me.
  2606. -- 
  2607. Aaron Giles (giles@med.cornell.edu)
  2608. Power Macintosh Developer, Cornell University Medical College
  2609. JPEGView home page: http://www.med.cornell.edu/jpegview.html
  2610. JPEGView FTP site:   ftp://ftp.med.cornell.edu/pub/jpegview/
  2611.  
  2612. +++++++++++++++++++++++++++
  2613.  
  2614. >From osiris@cs.utexas.edu (Rob Browning)
  2615. Date: Wed, 07 Dec 1994 13:35:36 -0600
  2616. Organization: The University of Texas at Austin
  2617.  
  2618. In article <giles-0712941140520001@wiggin.med.cornell.edu>,
  2619. giles@med.cornell.edu (Aaron Giles) wrote:
  2620.  
  2621. > Just pass it a nil value, and the OS will figure it out for you.  That
  2622. > goes for GWorlds, too.  In fact, the only time I ever use something other
  2623. > than nil for the device parameter is when I'm saving and restoring the
  2624. > port by using GetGWorld/SetGWorld, in which case I just pass the device
  2625. > that GetGWorld gave me.
  2626.  
  2627. OK, I was hoping to treat wins, ports, and worlds the same in some code
  2628. I'm writing, but I realized that since you have to LockPixels on a world,
  2629. you can't treat it exactly the same as a port.  So is there some
  2630. (standard, i.e. supported) way, given a pointer to a port or world, to
  2631. determine which one it is?
  2632.  
  2633. If not, I guess I can always create a wrapper class/structure that knows
  2634. which kind of pointer it has...
  2635.  
  2636. Thanks,
  2637.  
  2638. --Rob.
  2639.  
  2640. +++++++++++++++++++++++++++
  2641.  
  2642. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  2643. Date: 7 Dec 1994 23:35:59 GMT
  2644. Organization: University of Canterbury, Christchurch, New Zealand
  2645.  
  2646.  
  2647. In article <osiris-0712940303030001@slip-8-15.ots.utexas.edu>, osiris@cs.utexas.edu (Rob Browning) writes:
  2648. |> I saw some sample code that did something like this:
  2649. |> 
  2650. |> SetGWorld(myWin,GetMainDevice());
  2651. |> 
  2652. |> Will this always work?  Am I guaranteed that every onscreen window's
  2653. |> associated device is the main device?
  2654.  
  2655. Yes, I think so. There is some trickery going on which
  2656. effectively joins all your screens together and makes
  2657. them behave like a single grafport. The main screen's
  2658. grafport and its associated gdevice are the "representatives"
  2659. through which you deal with the whole collection.
  2660. Whenever you draw something while the current grafport's
  2661. pixmap is the main screen, it's also done to all the other
  2662. screens and their associated gdevices if necessary.
  2663.  
  2664. |> --Rob.
  2665.  
  2666. Greg Ewing, Computer Science Dept, +--------------------------------------+
  2667. University of Canterbury,          | A citizen of NewZealandCorp, a       |
  2668. Christchurch, New Zealand          | wholly-owned subsidiary of Japan Inc.|
  2669. greg@cosc.canterbury.ac.nz         +--------------------------------------+
  2670.  
  2671. +++++++++++++++++++++++++++
  2672.  
  2673. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  2674. Date: 8 Dec 94 15:03:32 +1300
  2675. Organization: University of Waikato, Hamilton, New Zealand
  2676.  
  2677. In article <3c5gsv$i8g@cantua.canterbury.ac.nz>, greg@cosc.canterbury.ac.nz (Greg Ewing) writes:
  2678. >
  2679. > In article <osiris-0712940303030001@slip-8-15.ots.utexas.edu>, osiris@cs.utexas.edu (Rob Browning) writes:
  2680. > |> I saw some sample code that did something like this:
  2681. > |>
  2682. > |> SetGWorld(myWin,GetMainDevice());
  2683. > |>
  2684. > |> Will this always work?  Am I guaranteed that every onscreen window's
  2685. > |> associated device is the main device?
  2686. >
  2687. > Yes, I think so.
  2688.  
  2689. Don't think, know. Inside Mac Vol V, page V-122: "when an application opens
  2690. a window, the window's port.portBits.baseAddr field is set to be equal to
  2691. the base address of the main screen. When QuickDraw draws into a grafPort or
  2692. cGrafPort, it compares the base address of the port to the main screen. If
  2693. they are equal, then QuickDraw might need to draw to multiple screens."
  2694.  
  2695. Hmm, can't find the equivalent statement inside the new "Inside Macintosh:
  2696. Imaging With QuickDraw"...
  2697.  
  2698. > Greg Ewing, Computer Science Dept, +--------------------------------------+
  2699. > University of Canterbury,        | A citizen of NewZealandCorp, a       |
  2700. > Christchurch, New Zealand        | wholly-owned subsidiary of Japan Inc.|
  2701. > greg@cosc.canterbury.ac.nz       +--------------------------------------+
  2702.  
  2703. Lawrence "RTFM" D'Oliveiro
  2704. just another member of the invading Asian horde
  2705.  
  2706. +++++++++++++++++++++++++++
  2707.  
  2708. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  2709. Date: 8 Dec 94 17:28:09 +1300
  2710. Organization: University of Waikato, Hamilton, New Zealand
  2711.  
  2712. In article <osiris-0712940303030001@slip-8-15.ots.utexas.edu>, osiris@cs.utexas.edu (Rob Browning) writes:
  2713. > I got the impression from NIM:Imaging that you are supposed to use
  2714. > SetGWorld and GetGWorld instead of SetPort and GetPort for all graphics
  2715. > context switches when you are using color quickdraw (p. 2-18 (among other
  2716. > places)).
  2717.  
  2718. Not really. You only need to use Get/SetGWorld if you're doing offscreen
  2719. drawing (typically using GWorlds).
  2720.  
  2721. > Now my question is, if I create a window or CGrafPort, and I then want to
  2722. > make it the current port, how do I know what to pass SetGWorld in the
  2723. > device parameter?   In other words, if I have a pointer to a window that I
  2724. > want to make the current port, how do I know what it's device is?
  2725.  
  2726. Pass nil. For an on-screen window, Color QuickDraw will automatically
  2727. substitute the main screen device. For an off-screen GWorld, the device you
  2728. pass is ignored anyway, and the one attached to the GWorld is used.
  2729.  
  2730. For off-screen drawing, the sequence I recommend you use is:
  2731.  
  2732.     GetGWorld(PreviousGWorld, PreviousGDevice);
  2733.     SetGWorld(MyGWorld, nil);
  2734.     ... { do your offscreen drawing }
  2735.     SetGWorld(PreviousGWorld, PreviousGDevice)
  2736.  
  2737. Another tip: always make sure the current GWorld is set to an on-screen window
  2738. before calling WaitNextEvent or using any other toolbox calls that may draw
  2739. on-screen.
  2740.  
  2741. > I saw some sample code that did something like this:
  2742. >
  2743. > SetGWorld(myWin,GetMainDevice());
  2744. >
  2745. > Will this always work?  Am I guaranteed that every onscreen window's
  2746. > associated device is the main device?
  2747.  
  2748. Yes, it will always work, but it's easier to just pass nil.
  2749.  
  2750. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  2751. Computer Services Dept                     fax: +64-7-838-4066
  2752. University of Waikato            electric mail: ldo@waikato.ac.nz
  2753. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+13:00
  2754.  
  2755. +++++++++++++++++++++++++++
  2756.  
  2757. >From hanrek@cts.com (Mark Hanrek)
  2758. Date: Thu, 8 Dec 1994 01:29:33 GMT
  2759. Organization: The Information Worskhop
  2760.  
  2761. In article <osiris-0712940303030001@slip-8-15.ots.utexas.edu>,
  2762. osiris@cs.utexas.edu (Rob Browning) wrote:
  2763.  
  2764. > I got the impression from NIM:Imaging that you are supposed to use
  2765. > SetGWorld and GetGWorld instead of SetPort and GetPort for all graphics
  2766. > context switches when you are using color quickdraw (p. 2-18 (among other
  2767. > places)).
  2768. > Now my question is, if I create a window or CGrafPort, and I then want to
  2769. > make it the current port, how do I know what to pass SetGWorld in the
  2770. > device parameter?   In other words, if I have a pointer to a window that I
  2771. > want to make the current port, how do I know what it's device is?
  2772. > I saw some sample code that did something like this:
  2773. > SetGWorld(myWin,GetMainDevice());
  2774. > Will this always work?  Am I guaranteed that every onscreen window's
  2775. > associated device is the main device?
  2776.  
  2777.  
  2778. Rob,
  2779.  
  2780. Good question.  Typically, dealing with ports starts in the event loop.
  2781.  
  2782. In your update handler, for instance, once you've extracted the port
  2783. (window) from the event, you can...
  2784.  
  2785.    SetPort( eventWindow );
  2786.    GetGWorld( &windowGW, &windowGD );
  2787.  
  2788. and keep the GDHandle ("windowGD") around for use later as needed. 
  2789.  
  2790. The event loop will pass control to you with the current device already
  2791. set to the one that goes with the event window.  If you wanted to
  2792. determine the actual device, you would do a GetWindowDevice() function,
  2793. the source code for which is available in the DTS.lib software, either in
  2794. "utility.c" or "windows.c" found on the Developer CD, eWorld, or at
  2795. ftp.apple.com.
  2796.  
  2797. Do this, and you'll see how everything else falls into place.
  2798.  
  2799.  
  2800. Hope this helps.
  2801.  
  2802. Mark Hanrek
  2803.  
  2804. ---------------------------
  2805.  
  2806. >From jmk3@crux4.cit.cornell.edu (Jay Krell)
  2807. Subject: static RoutineDescriptors
  2808. Date: 29 Nov 1994 14:02:55 GMT
  2809. Organization: Cornell University
  2810.  
  2811. 'm having trouble making static routine descriptors/upps in code for
  2812. 68K and PPC.
  2813.  
  2814. There is an example on p. 2-23 on IM:PPC, but it has a few problems.
  2815. It uses @ instead of &, trivial. It has incorrect typing on 68k, in
  2816. that a UniversalProcPtr is not the address of a RoutineDescriptor.
  2817.  
  2818. It seems to me that one simple solution is for RoutineDescriptor's to
  2819. exist in 68k, but simply be a jmp and the ProcPtr. But I guess...
  2820. that could cause problems in that you then have to find a place to
  2821. keep the stub around, but if you have to do it for PPC anyway it
  2822. shouldn't be a problem.
  2823.  
  2824. (p. 2-23 of IM is roughly:
  2825.  
  2826. RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  2827. UniversalProcPtr myproc= &myRD;
  2828.  
  2829. ToolboxCall(myproc);
  2830.  
  2831. )
  2832.  
  2833. --
  2834.  -- jay.krell@cornell.edu
  2835.  
  2836. +++++++++++++++++++++++++++
  2837.  
  2838. >From jmk3@crux4.cit.cornell.edu (Jay Krell)
  2839. Date: 29 Nov 1994 17:29:37 GMT
  2840. Organization: Cornell University
  2841.  
  2842.   I came up with this disgusting solution for doing static
  2843.   upp's on 68k and PPC:
  2844.   
  2845.   #define JMP68k 0x4EF9
  2846.   #define JMP68k_bytes 0x4E, 0xF9
  2847.   #define NOP68k 0x4E71
  2848.   #define NOP68k_bytes 0x4E, 0x71
  2849.   #define NOP68k_long 0x4E714E71
  2850.   
  2851.   #if USESCODEFRAGMENTS
  2852.   #define build_upp(type,proc) BUILD_ROUTINE_DESCRIPTOR(type,proc)
  2853.   #else
  2854.   #define build_upp(type,proc) {NOP68k, NOP68k_bytes, NOP68k_long, \
  2855.   NOP68k_bytes, NOP68k, NOP68k_long, NOP68k_bytes, JMP68k, proc}
  2856.   #endif
  2857.   
  2858.   static RoutineDescriptor scrollrd= build_upp(uppControlActionProcInfo, (ProcPtr)ScrollProc2);
  2859.   
  2860.   TrackControl(theControl, myPt, (ControlActionUPP) &scrollrd);
  2861.   
  2862.   but I'd gladly be corrected with something nicer. I should
  2863.   probably replace all the nop's with a branch, but that is
  2864.   pushing my 68k assembly ability.
  2865.  
  2866. --
  2867.  -- jay.krell@cornell.edu
  2868.  
  2869. +++++++++++++++++++++++++++
  2870.  
  2871. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  2872. Date: Tue, 29 Nov 1994 12:31:20 -0600
  2873. Organization: Univ of Wisc-Madison, Dept of Biochemistry
  2874.  
  2875. In article <3bfoe1$j1m@tuba.cit.cornell.edu>, jmk3@crux4.cit.cornell.edu
  2876. (Jay Krell) wrote:
  2877.  
  2878. >   I came up with this disgusting solution for doing static
  2879. >   upp's on 68k and PPC:
  2880. >   
  2881. >   #define JMP68k 0x4EF9
  2882. >   #define JMP68k_bytes 0x4E, 0xF9
  2883. >   #define NOP68k 0x4E71
  2884. >   #define NOP68k_bytes 0x4E, 0x71
  2885. >   #define NOP68k_long 0x4E714E71
  2886. >   
  2887. >   #if USESCODEFRAGMENTS
  2888. >   #define build_upp(type,proc) BUILD_ROUTINE_DESCRIPTOR(type,proc)
  2889. >   #else
  2890. >   #define build_upp(type,proc) {NOP68k, NOP68k_bytes, NOP68k_long, \
  2891. >   NOP68k_bytes, NOP68k, NOP68k_long, NOP68k_bytes, JMP68k, proc}
  2892. >   #endif
  2893. >   
  2894. >   static RoutineDescriptor scrollrd= build_upp(uppControlActionProcInfo,
  2895. (ProcPtr)ScrollProc2);
  2896. >   
  2897. >   TrackControl(theControl, myPt, (ControlActionUPP) &scrollrd);
  2898.  
  2899. If I'm understanding your question, it's not at all that complicated:
  2900.  
  2901. static ControlActionUPP scrollrd;
  2902.  
  2903. scrollrd = NewControlDefProc(ScrollProc2);
  2904.  
  2905. TrackControl(theControl,myPt,scrollrd);
  2906.  
  2907. NewControlDefProc is conditionally compiled for 68K vs. PPC.  If compiling
  2908. for 68K, the ControlActionUPP is just a normal procptr, for PPC, it is a
  2909. routine descriptor (look in Controls.h).
  2910.  
  2911. Please let me know if I missed the point of your question.
  2912.  
  2913. Ken Prehoda
  2914. Department of Biochemistry
  2915. University of Wisconsin-Madison
  2916. kenp@nmrfam.wisc.edu
  2917.  
  2918. +++++++++++++++++++++++++++
  2919.  
  2920. >From dubois@primate.wisc.edu (Paul DuBois)
  2921. Date: 29 Nov 1994 14:27:05 -0600
  2922. Organization: Castra Parvulorum
  2923.  
  2924. >From article <3bfcaf$ee4@tuba.cit.cornell.edu>, by jmk3@crux4.cit.cornell.edu (Jay Krell):
  2925. > 'm having trouble making static routine descriptors/upps in code for
  2926. > 68K and PPC.
  2927. > (p. 2-23 of IM is roughly:
  2928. > RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  2929. > UniversalProcPtr myproc= &myRD;
  2930. > ToolboxCall(myproc);
  2931.  
  2932. I do something like this:
  2933.  
  2934. #if ppc code
  2935. RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  2936. UniversalProcPtr myproc= &myRD;
  2937. #else   /* 68K code */
  2938. UniversalProcPtr myproc= uppproc;
  2939. #endif
  2940.  
  2941. ToolboxCall(myproc);
  2942.  
  2943. This makes myproc point to a routine descriptor for PowerPC code and
  2944. and to the function itself for 68K code.
  2945. -- 
  2946. Paul DuBois
  2947. dubois@primate.wisc.edu
  2948.  
  2949. +++++++++++++++++++++++++++
  2950.  
  2951. >From omh@cs.brown.edu (Owen M. Hartnett)
  2952. Date: Wed, 30 Nov 1994 04:43:15 GMT
  2953. Organization: Brown University Department of Computer Science
  2954.  
  2955. In article <3bg2qpINNdvn@uakari.primate.wisc.edu> dubois@primate.wisc.edu writes:
  2956. >From article <3bfcaf$ee4@tuba.cit.cornell.edu>, by jmk3@crux4.cit.cornell.edu (Jay Krell):
  2957. >> 'm having trouble making static routine descriptors/upps in code for
  2958. >> 68K and PPC.
  2959. >> 
  2960. >> (p. 2-23 of IM is roughly:
  2961. >> 
  2962. >> RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  2963. >> UniversalProcPtr myproc= &myRD;
  2964. >> 
  2965. >> ToolboxCall(myproc);
  2966. >
  2967. >I do something like this:
  2968. >
  2969. >#if ppc code
  2970. >RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  2971. >UniversalProcPtr myproc= &myRD;
  2972. >#else  /* 68K code */
  2973. >UniversalProcPtr myproc= uppproc;
  2974. >#endif
  2975. >
  2976. >ToolboxCall(myproc);
  2977. >
  2978. >This makes myproc point to a routine descriptor for PowerPC code and
  2979. >and to the function itself for 68K code.
  2980.  
  2981. But the Universal Headers will do that for you anyway. They're macroed
  2982. on the 68K to just pass the procptr, and to do the right thing on the
  2983. PPC.
  2984.  
  2985. What you want to do is check your code for the Universal Headers, you
  2986. can do this by looking for #ifdef __CONDITIONALMACROS__
  2987.  
  2988. Here's a little standard file hacking:
  2989.  
  2990. // definitions
  2991. #ifdef __CONDITIONALMACROS__
  2992.         FileFilterUPP           myFolderFilterUPP;
  2993.         ModalFilterUPP  myFolderEventsUPP;
  2994.         DlgHookUPP              myDlgHookUPP;
  2995. #endif
  2996.  
  2997. // code
  2998. #ifdef __CONDITIONALMACROS__
  2999.         myFolderFilterUPP = NewFileFilterProc(FolderFilter);
  3000.         myFolderEventsUPP = NewModalFilterProc(FolderEvents);
  3001.         myDlgHookUPP = NewDlgHookYDProc(FolderItems);
  3002.         SFPGetFile(where, (StringPtr)0, myFolderFilterUPP, -1, 0, myDlgHookUPP,
  3003.                    &reply, 20001, myFolderEventsUPP);
  3004.         DisposeRoutineDescriptor(myFolderFilterUPP);
  3005.         DisposeRoutineDescriptor(myFolderEventsUPP);
  3006.         DisposeRoutineDescriptor(myDlgHookUPP);
  3007. #else
  3008.         SFPGetFile(where, (StringPtr)0, (ProcPtr) FolderFilter, -1, 0, FolderItems,
  3009.                    &reply, 20001, (ProcPtr) FolderEvents);
  3010. #endif
  3011.  
  3012. -Owen
  3013.  
  3014. -- 
  3015. Owen Hartnett                           omh@cs.brown.edu
  3016. "FAITH, n. Belief without evidence in what is told by one who speaks
  3017.                 without knowledge, of things without parallel."
  3018.                         -Ambrose Bierce - The Devil's Dictionary
  3019.  
  3020. +++++++++++++++++++++++++++
  3021.  
  3022. >From dubois@primate.wisc.edu (Paul DuBois)
  3023. Date: 30 Nov 1994 09:48:56 -0600
  3024. Organization: Castra Parvulorum
  3025.  
  3026. >From article <1994Nov30.044315.15619@cs.brown.edu>, by omh@cs.brown.edu (Owen M. Hartnett):
  3027. > In article <3bg2qpINNdvn@uakari.primate.wisc.edu> dubois@primate.wisc.edu writes:
  3028. >>From article <3bfcaf$ee4@tuba.cit.cornell.edu>, by jmk3@crux4.cit.cornell.edu (Jay Krell):
  3029. >>> 'm having trouble making static routine descriptors/upps in code for
  3030. >>> 68K and PPC.
  3031. >>> 
  3032. >>> (p. 2-23 of IM is roughly:
  3033. >>> 
  3034. >>> RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  3035. >>> UniversalProcPtr myproc= &myRD;
  3036. >>> 
  3037. >>> ToolboxCall(myproc);
  3038. >>
  3039. >>I do something like this:
  3040. >>
  3041. >>#if ppc code
  3042. >>RoutineDescriptor myRD= BUILD_ROUTINE_DESCRIPTOR(upptype, uppproc);
  3043. >>UniversalProcPtr myproc= &myRD;
  3044. >>#else /* 68K code */
  3045. >>UniversalProcPtr myproc= uppproc;
  3046. >>#endif
  3047. >>
  3048. >>ToolboxCall(myproc);
  3049. >>
  3050. >>This makes myproc point to a routine descriptor for PowerPC code and
  3051. >>and to the function itself for 68K code.
  3052. > But the Universal Headers will do that for you anyway. They're macroed
  3053. > on the 68K to just pass the procptr, and to do the right thing on the
  3054. > PPC.
  3055.  
  3056. The Universal Headers will do *what* for you anyway?  Define
  3057. BUILD_ROUTINE_DESCRIPTOR for the 68K case?  Unless I'm missing something,
  3058. that macro isn't conditionally defined differently for 68K vs. PPC
  3059. code.
  3060.  
  3061. The example you give below works for the use of routine descriptor
  3062. generating functions that are called on the fly.  The original posting
  3063. asked for a method for static routine descriptor allocation.
  3064.  
  3065. > What you want to do is check your code for the Universal Headers, you
  3066. > can do this by looking for #ifdef __CONDITIONALMACROS__
  3067. > Here's a little standard file hacking:
  3068. > // definitions
  3069. > #ifdef __CONDITIONALMACROS__
  3070. >       FileFilterUPP           myFolderFilterUPP;
  3071. >       ModalFilterUPP  myFolderEventsUPP;
  3072. >       DlgHookUPP              myDlgHookUPP;
  3073. > #endif
  3074. > // code
  3075. > #ifdef __CONDITIONALMACROS__
  3076. >       myFolderFilterUPP = NewFileFilterProc(FolderFilter);
  3077. >       myFolderEventsUPP = NewModalFilterProc(FolderEvents);
  3078. >       myDlgHookUPP = NewDlgHookYDProc(FolderItems);
  3079. >       SFPGetFile(where, (StringPtr)0, myFolderFilterUPP, -1, 0, myDlgHookUPP,
  3080. >                  &reply, 20001, myFolderEventsUPP);
  3081. >       DisposeRoutineDescriptor(myFolderFilterUPP);
  3082. >       DisposeRoutineDescriptor(myFolderEventsUPP);
  3083. >       DisposeRoutineDescriptor(myDlgHookUPP);
  3084. > #else
  3085. >       SFPGetFile(where, (StringPtr)0, (ProcPtr) FolderFilter, -1, 0, FolderItems,
  3086. >                  &reply, 20001, (ProcPtr) FolderEvents);
  3087. > #endif
  3088. -- 
  3089. Paul DuBois
  3090. dubois@primate.wisc.edu
  3091.  
  3092. +++++++++++++++++++++++++++
  3093.  
  3094. >From pottier@corvette.ens.fr (Francois Pottier)
  3095. Date: 30 Nov 1994 18:28:36 GMT
  3096. Organization: Ecole Normale Superieure, PARIS, France
  3097.  
  3098. In article <3bi6t8INNjg2@uakari.primate.wisc.edu>,
  3099. Paul DuBois <dubois@primate.wisc.edu> wrote:
  3100.  
  3101. >> But the Universal Headers will do that for you anyway. They're macroed
  3102. >> on the 68K to just pass the procptr, and to do the right thing on the
  3103. >> PPC.
  3104. >
  3105. >The Universal Headers will do *what* for you anyway?  Define
  3106. >BUILD_ROUTINE_DESCRIPTOR for the 68K case?  Unless I'm missing something,
  3107. >that macro isn't conditionally defined differently for 68K vs. PPC
  3108. >code.
  3109.  
  3110. Paul is right. BUILD_ROUTINE_DESCRIPTOR is defined only on the PPC.
  3111. Using BUILD_ROUTINE_DESCRIPTOR instead of NewWhateverUPP() is better
  3112. because it doesn't cause any heap allocation. I remember discussing
  3113. this topic with Zalman Stern a while ago on csmp, he defines a macro
  3114. that simply returns a function pointer on 68k and builds a static
  3115. routine descriptor using BUILD_ROUTINE_DESCRIPTOR on PPC.
  3116.  
  3117.  
  3118.  
  3119. -- 
  3120. Francois Pottier                                            pottier@dmi.ens.fr
  3121. - ----------------------------------------------------------------------------
  3122. Check my WWW page at http://acacia.ens.fr:8080/home/pottier/index.html ...
  3123.  
  3124. +++++++++++++++++++++++++++
  3125.  
  3126. >From jpek@umich.edu (Jeff Pek)
  3127. Date: 30 Nov 1994 18:24:11 GMT
  3128. Organization: U of Mich (MBA)
  3129.  
  3130. In article <3bi6t8INNjg2@uakari.primate.wisc.edu>
  3131. dubois@primate.wisc.edu (Paul DuBois) writes:
  3132.  
  3133. > >>This makes myproc point to a routine descriptor for PowerPC code and
  3134. > >>and to the function itself for 68K code.
  3135. > > 
  3136. > > But the Universal Headers will do that for you anyway. They're macroed
  3137. > > on the 68K to just pass the procptr, and to do the right thing on the
  3138. > > PPC.
  3139. > The Universal Headers will do *what* for you anyway?  Define
  3140. > BUILD_ROUTINE_DESCRIPTOR for the 68K case?  Unless I'm missing something,
  3141. > that macro isn't conditionally defined differently for 68K vs. PPC
  3142. > code.
  3143.  
  3144. Univ Headers define macros (that are conditionally defined) to create
  3145. UPPs for all system callbacks (e.g. ControlActionUPP). You don't have
  3146. to have any #ifxxx junk in your code, as the appropriate univ hdr file
  3147. will take care of that.
  3148.  
  3149. > The example you give below works for the use of routine descriptor
  3150. > generating functions that are called on the fly.  The original posting
  3151. > asked for a method for static routine descriptor allocation.
  3152.  
  3153. To create a static upp, you just have to do (something like):
  3154.  
  3155. pascal Boolean fcn(...);
  3156. static xxxUPP = NewxxxProc(fcn);
  3157.  
  3158. Jeff
  3159. - -------------------------------------------
  3160. Jeff Pek                       jpek@umich.edu
  3161. Emerald Intelligence / University of Michigan
  3162.  
  3163. +++++++++++++++++++++++++++
  3164.  
  3165. >From chopps@water.emich.edu (Christian E. Hopps)
  3166. Date: 30 Nov 1994 18:58:22 GMT
  3167. Organization: University of Michigan EECS Dept.
  3168.  
  3169. Jeff Pek (jpek@umich.edu) wrote:
  3170. [...]
  3171. : To create a static upp, you just have to do (something like):
  3172.  
  3173. : pascal Boolean fcn(...);
  3174. : static xxxUPP = NewxxxProc(fcn);
  3175.  
  3176. Heh, obviously someone whose roots are in C++ (as opposed to C) :)
  3177. This doesn't work in C BTW.  Other solutions have been posted..
  3178.  
  3179. Chris.
  3180.  
  3181. +++++++++++++++++++++++++++
  3182.  
  3183. >From dubois@primate.wisc.edu (Paul DuBois)
  3184. Date: 30 Nov 1994 15:43:21 -0600
  3185. Organization: Castra Parvulorum
  3186.  
  3187. >From article <3big0b$bg5@lastactionhero.rs.itd.umich.edu>, by jpek@umich.edu (Jeff Pek):
  3188. > In article <3bi6t8INNjg2@uakari.primate.wisc.edu>
  3189. > dubois@primate.wisc.edu (Paul DuBois) writes:
  3190. >> >>This makes myproc point to a routine descriptor for PowerPC code and
  3191. >> >>and to the function itself for 68K code.
  3192. >> > 
  3193. >> > But the Universal Headers will do that for you anyway. They're macroed
  3194. >> > on the 68K to just pass the procptr, and to do the right thing on the
  3195. >> > PPC.
  3196. >> 
  3197. >> The Universal Headers will do *what* for you anyway?  Define
  3198. >> BUILD_ROUTINE_DESCRIPTOR for the 68K case?  Unless I'm missing something,
  3199. >> that macro isn't conditionally defined differently for 68K vs. PPC
  3200. >> code.
  3201. > Univ Headers define macros (that are conditionally defined) to create
  3202. > UPPs for all system callbacks (e.g. ControlActionUPP). You don't have
  3203. > to have any #ifxxx junk in your code, as the appropriate univ hdr file
  3204. > will take care of that.
  3205.  
  3206. Not for BUILD_ROUTINE_DESCRIPTOR, which isn't a callback and isn't
  3207. conditionally defined.
  3208.  
  3209. >> The example you give below works for the use of routine descriptor
  3210. >> generating functions that are called on the fly.  The original posting
  3211. >> asked for a method for static routine descriptor allocation.
  3212. > To create a static upp, you just have to do (something like):
  3213. > pascal Boolean fcn(...);
  3214. > static xxxUPP = NewxxxProc(fcn);
  3215.  
  3216. Well, perhaps I understand these issues less well than I *already* thought
  3217. I didn't understand them :-), but how would this work?  Wouldn't it allocate
  3218. a pointer object on the heap, as opposed to static allocation of the routine
  3219. descriptor?  (The latter being what is desired for the question that began
  3220. this thread.)
  3221.  
  3222.  
  3223. Another nice question is how to get the right sort of callback when you
  3224. want to generate either PPC or 68K code, *and* you want people that don't
  3225. have the universal headers to be able to compile the source.  (The latter
  3226. would be generating 68K code only, of course.)
  3227. -- 
  3228. Paul DuBois
  3229. dubois@primate.wisc.edu
  3230.  
  3231. +++++++++++++++++++++++++++
  3232.  
  3233. >From omh@cs.brown.edu (Owen M. Hartnett)
  3234. Date: Thu, 1 Dec 1994 02:41:55 GMT
  3235. Organization: Brown University Department of Computer Science
  3236.  
  3237. In article <3birlpINNoqk@uakari.primate.wisc.edu> dubois@primate.wisc.edu writes:
  3238. >From article <3big0b$bg5@lastactionhero.rs.itd.umich.edu>, by jpek@umich.edu (Jeff Pek):
  3239. >> In article <3bi6t8INNjg2@uakari.primate.wisc.edu>
  3240. >> dubois@primate.wisc.edu (Paul DuBois) writes:
  3241. >> 
  3242. >>> >>This makes myproc point to a routine descriptor for PowerPC code and
  3243. >>> >>and to the function itself for 68K code.
  3244. >>> > 
  3245. >>> > But the Universal Headers will do that for you anyway. They're macroed
  3246. >>> > on the 68K to just pass the procptr, and to do the right thing on the
  3247. >>> > PPC.
  3248. >>> 
  3249. >>> The Universal Headers will do *what* for you anyway?  Define
  3250. >>> BUILD_ROUTINE_DESCRIPTOR for the 68K case?  Unless I'm missing something,
  3251. >>> that macro isn't conditionally defined differently for 68K vs. PPC
  3252. >>> code.
  3253. >> 
  3254. >> Univ Headers define macros (that are conditionally defined) to create
  3255. >> UPPs for all system callbacks (e.g. ControlActionUPP). You don't have
  3256. >> to have any #ifxxx junk in your code, as the appropriate univ hdr file
  3257. >> will take care of that.
  3258. >
  3259. >Not for BUILD_ROUTINE_DESCRIPTOR, which isn't a callback and isn't
  3260. >conditionally defined.
  3261. >
  3262. >>> The example you give below works for the use of routine descriptor
  3263. >>> generating functions that are called on the fly.  The original posting
  3264. >>> asked for a method for static routine descriptor allocation.
  3265. >> 
  3266. >> To create a static upp, you just have to do (something like):
  3267. >> 
  3268. >> pascal Boolean fcn(...);
  3269. >> static xxxUPP = NewxxxProc(fcn);
  3270. >
  3271. >Well, perhaps I understand these issues less well than I *already* thought
  3272. >I didn't understand them :-), but how would this work?  Wouldn't it allocate
  3273. >a pointer object on the heap, as opposed to static allocation of the routine
  3274. >descriptor?  (The latter being what is desired for the question that began
  3275. >this thread.)
  3276. >
  3277. >
  3278. >Another nice question is how to get the right sort of callback when you
  3279. >want to generate either PPC or 68K code, *and* you want people that don't
  3280. >have the universal headers to be able to compile the source.  (The latter
  3281. >would be generating 68K code only, of course.)
  3282.  
  3283. Hmmm... As it turned out to be a deeper problem than I originally thought, I
  3284. went back and read Develop 16's explanation, which is less than clear.
  3285.  
  3286. It was my assumption that you could allocate the static routine
  3287. descriptor, and, under 68K, it would do the right thing. Indeed the article
  3288. somewhat implies that this is so (by stating you could either allocate a UPP
  3289. or use BUILDROUTINEDESCRIPTOR for static.
  3290.  
  3291. But looking at MixedMode.h, there's only one definition for it, and it
  3292. builds a full Routine Desciptor record. Now the question is, if you use
  3293. this record on a 68K, will you live to tell of it? (i.e. is the code
  3294. smart enough to know what you're doing.)
  3295.  
  3296. -Owen
  3297.  
  3298.  
  3299.  
  3300. -- 
  3301. Owen Hartnett                           omh@cs.brown.edu
  3302. "FAITH, n. Belief without evidence in what is told by one who speaks
  3303.                 without knowledge, of things without parallel."
  3304.                         -Ambrose Bierce - The Devil's Dictionary
  3305.  
  3306. +++++++++++++++++++++++++++
  3307.  
  3308. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  3309. Date: Thu, 01 Dec 1994 13:26:43 -0600
  3310. Organization: Univ of Wisc-Madison, Dept of Biochemistry
  3311.  
  3312. In article <1994Dec1.024155.26434@cs.brown.edu>, omh@cs.brown.edu (Owen M.
  3313. Hartnett) wrote:
  3314.  
  3315. > But looking at MixedMode.h, there's only one definition for it, and it
  3316. > builds a full Routine Desciptor record. Now the question is, if you use
  3317. > this record on a 68K, will you live to tell of it? (i.e. is the code
  3318. > smart enough to know what you're doing.)
  3319. > -Owen
  3320.  
  3321. No, you won't.  The 68K expects a procptr to be a procptr.  If you give it
  3322. a routine descriptor, it will jump to the first entry in the descriptor,
  3323. which is _MixedModeMagic and is not implemented on 68K.  The CFM for 68k
  3324. may change this.
  3325.  
  3326. I haven't actually done this so...
  3327.  
  3328. Ken Prehoda
  3329. Department of Biochemistry
  3330. University of Wisconsin-Madison
  3331. kenp@nmrfam.wisc.edu
  3332.  
  3333. +++++++++++++++++++++++++++
  3334.  
  3335. >From rang@winternet.com (Anton Rang)
  3336. Date: 02 Dec 1994 02:57:44 GMT
  3337. Organization: Trillium Research, Inc.
  3338.  
  3339. In article <3big8k$8jo@nef.ens.fr> pottier@corvette.ens.fr (Francois Pottier) writes:
  3340. >Paul is right. BUILD_ROUTINE_DESCRIPTOR is defined only on the PPC.
  3341. >Using BUILD_ROUTINE_DESCRIPTOR instead of NewWhateverUPP() is better
  3342. >because it doesn't cause any heap allocation.
  3343.  
  3344.   If you're writing an accelerated code resource (e.g. a WDEF, CDEF,
  3345. or other resource called using 68K calling conventions), there's an
  3346. even better reason to use a static routine descriptor: the code
  3347. fragment manager will automatically make it point to the right place
  3348. if your code gets relocated.
  3349.  
  3350.   Of course, most accelerated resources are called at memory-safe
  3351. times, so you can allocate and deallocate a routine descriptor
  3352. dynamically, but....
  3353. --
  3354. Anton Rang (rang@winternet.com)
  3355.  
  3356. +++++++++++++++++++++++++++
  3357.  
  3358. >From Joe Francis <Joe.Francis@dartmouth.edu>
  3359. Date: 7 Dec 1994 16:04:32 GMT
  3360. Organization: Smooth Roo Software
  3361.  
  3362. #if USESROUTINEDESCRIPTORS
  3363.         RoutineDescriptor RBApp_DialogFilterProc_RD =
  3364.                 BUILD_ROUTINE_DESCRIPTOR(uppFileFilterYDProcInfo,&OifFileHook);
  3365.         #define RBDIALOGFILT (FileFilterYDUPP)&RBApp_DialogFilterProc_RD
  3366. #else
  3367.         #define RBDIALOGFILT (FileFilterYDUPP)OifFileHook
  3368. #endif
  3369.  
  3370.  
  3371. - ------------------------------------------------------------------------
  3372. "When we gave Bill Gates his first demo of the Macintosh, the first 
  3373. question he asked was "What kind of hardware do you use for the cursor?"
  3374. -Andy Hertzfeld, at the MacHack '94 Keynote address
  3375. - ------------------------------------------------------------------------
  3376.  
  3377. ---------------------------
  3378.  
  3379. End of C.S.M.P. Digest
  3380. **********************
  3381.